第四天、PL/SQL基础

2008/03/20

PL/SQL基础

1.PL/SQL基础

2.PL/SQL块结构
DECLARE
....变量声明
BEGIN
....
EXCEPTION
....
END;

变量声明的内容
赋变量适当的名称,变量正确的数据类型,定义变量,控件变量范围
命名规则
由字符开头,可以包含数了,下划线,$,#等,长度1-30,大小写不区分,不能是系统关键字
例:
DECLARE
X VARCHAR2(10);  定义变量区域
BEGIN
X:='THIS IS...';   变量赋值
DBMS_OUTPUT.PUT_LINE('X的值为:'||X);  ||是连接字符,不用转换类型
END        结束
/         结束,并执行
默认是不输也的,我们可以用SET
SET SERVEROUTPUT ON SIZE 10000  //开启输出,输也量为10000
这时候重新L,执行就能输出结果了。
save c:\plsql.txt  保存起来上面的块。
DBMS_OUTPUT.PUT('X的值为:'||X);  意思是不输出

--行注释内容
/*..块注释....*/
X varchar2(10):='abce';定义并赋值

@ c:\sqlplus.txt 执行文件中的内容

3.分支语句的使用
一、IF分支
IF ... THEN
....
ELSE IF ....THEN
....
ELSE
.....
END IF

例:
DECLARE
a number;
b varchar2(10);
BEGIN
a:=2;
IF a=1 THEN
b:='a';
ELSIF a=2 THEN
b:='b';
ELSE
b:='C';
END IF;
DBMS_OUTPUT.PUT_LINE('b的值是:'||b);
END;
/


二、CASE分支
CASE
WHEN...THEN...
ELSE
END CASE

例:
DECLARE
a number;
b varchar2(10);
BEGIN
a:=2;
CASE
WHEN a=1 THEN b:='a';
WHEN a=2 THEN b:='b';
....
ELSE
b:='c';
END CASE;
DBMS_OUTPUT.PUT_LINE('b的值是:'||b);
END;
/

4.环循语句的使用
1.基本循环LOOP
LOOP
...
END LOOP
例:
DECLAE
X NUMBER;
BEGIN
X:=0;
LOOP
X:=X+1;
IF X>=3 THEN
EXIT;
END IF;
DBMS_OUTPUT.PUT_LINE('体内X的值分别是:'||X);
END LOOP;
DBMS_OUTPUT.PUT_LINE('外X的值是:'||X);
END;
/

2.WHILE循环
WHILE expression LOOP
...
END LOOP;
例:
DECLAE
X NUMBER;
BEGIN
X:=0;
LOOP
X:=X+1;
EXIT WHEN X>=3
DBMS_OUTPUT.PUT_LINE('体内X的值分别是:'||X);
END LOOP;
DBMS_OUTPUT.PUT_LINE('外X的值是:'||X);
END;
/

DECLAE
X NUMBER;
BEGIN
X:=0;
WHILE X<=3 LOOP
X:=X+1;
DBMS_OUTPUT.PUT_LINE('体内X的值分别是:'||X);
END LOOP;
DBMS_OUTPUT.PUT_LINE('外X的值是:'||X);
END;
/

3.FOR循环
FOR counter IN [REVERSE] start_value..end_value LOOP
...
END LOOP;

例:
BEGIN
FOR I IN 1..5 LOOP
DBMS_OUTPUT.PUT_LINE('体内I的值分别是:'||I);
END LOOP;
DBMS_OUTPUT.PUT_LINE('END');
END;
/

FOR I IN REVERSE 1..5 LOOP  指的是倒着递增

GOTO语句的使用
DECLARE
X NUMBER;
BEGIN
X:=0;
<<REPEAT_LOOP>>   定义标记
X:=X+1;
DBMS_OUTPUT.PUT_LINE(X)
IF X<3 THEN
GOTO REPEAT_LOOP;   返回到标记处
END IF;
END;
/

5.异常处理的使用
1.什么是异常
在PL/SQL中的一个警告或错误的情形都被称为异常,包括编译时错误和运行时错误。
3.异常分类
系统异常,自定义异常
4.异常结构
EXCEPTION
WHEN...THEN
...
常见系统异常:
DUP_VAL_ON_INDEX:向有唯一约束的表中插入重复行
NO_DATA_FOUND:在一个SELECT INTO语句中无返回值 
TOO_MANY_ROWS:SELECT INTO 语句返回了多行
VALUES_ERROR:一个算法,转换,截断或大小约束发生错误
ZERO_DIVIDE:发生被零除
......

例:
DECLARE
test varchar2(10);
BEGIN
SELECT name INTO test FROM deptment WHERE id='tt';
DBMS_OUTPUT.PUT_LINE(test);
END;
/
这是就会出现一个错误no data found

我们来设置一个异常补获:
DECLARE
test varchar2(10);
BEGIN
SELECT name INTO test FROM deptment WHERE id='tt';
DBMS_OUTPUT.PUT_LINE(test);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('没有找到数据');
END;
/

自定义异常:
DECLARE
tname varchar2(10);
e exception;  定义常规异常
BEGIN
SELECT name INTO tname FROM deptment WHERE id='01;
IF tname<>'B部门' THEN
RAISE e;        异常
END IF;
DBMS_OUTPUT.PUT_LINE(tname);
EXCEPTION  异常处理部分
WHEN e THEN
DBMS_OUTPUT.PUT_LINE('ERROR,不是要的B部门');
END;
/

6.记录的使用
什么是记录:记录是由几个相关值构成的复合变量,常用于支持SELECT语句的返回值,使用记录可以将一行数据看成一个单元进行处理,而不必将每一列单独处理
记录的声明
TYPE type_name IS RECORD(
Variable_name datatype[,
Variable_name datatype[,
....
);
Real_name type_name;

例:
DECLARE
TYPE myrecord IS RECORD(
id varchar2(10),
name varchar2(10);
);
real_record myrecord;
BEGIN
SELECT e_id,e_name INTO real_record FROM emp WHERE e_id='001';
DBMS_OUTPUT.PUT_LINE(real_record.id||','||real_record.name);
END;
/

Oracle学习笔记--复合数据类型
By  洛基 发表于 2007-4-6 14:54:00  

1、PL/SQL记录
   适用于处理单行多列数据
   eg:
   type emp_record_type is record(
        name     emp.ename%type,
        salary   emp.salary%type,
        dno      emp.detno%type   
   );
   emp_record emp_record_type;
  
2、PL/SQL集合
   适用于处理单列多行的数据
  
   2.1  索引表
        eg1:
           type ename_table_type is table of emp.ename%type
           index by binary_integer; --(还可以是pls_integer)
           ename_table ename_table_type;       
           以下是两种放法:
                 .................
           forall i in ename_table.first..ename_table.last
             /* sql语句*/
                 ................... 
       
           for i in 1..ename_table.count loop
           /* sql语句 */
           end loop
                   .............. 
               
        eg2:
           type ename_table_type is table of number
           index by varchar(20);
           ename_table ename_table_type;
               ................
          
           ename_table('上海')=1;
           ename_table('北京')=2;
                ..............
      
        eg3:
        ename_table.delete;   --清空索引表的数据
       
  
   2.2  嵌套表
        下标从1开始,元素个数没有限制。
        eg:
           Type ename_table_type is table of emp.ename%type;
           ename_table  ename_table_type:=ename_table_type('A','A');  --必须要先初始化
                 ......
             dbms_output.put_line(ename_table(2));
                 ......
                   
   2.3  变长数组
        下标从1开始,元素的最大个数是有限制的
        eg:
           Type ename_table_type is varray(20) of emp.ename%type;
           ename_table ename_table_type:=ename_table_type('A','A');   --必须要先初始化
  
  
3、PL/SQL 记录表
        适用于多行多列数据
        eg:
          Type ename_table_type is table of emp%rowtype;
          index by binary_integer;
          ename_table ename_table_type;
          ------
          select * bulk collect into ename_table from emp;
          ------
         
  
4、多级集合
   用法都差不多
   4.1多级VARRAY
   4.2多级嵌套表
   4.3多级索引表         
 
 

原文地址:https://www.cnblogs.com/astar/p/1122130.html