PL/SQL 基础

PL/SQL代码编写规则.

1、标识符命名规则(前缀,后缀)

* 变量,v_         例:v_count, v_number

* 常量,c_         例:c_rate

* 异常,e_         例:e_integrity_error

* 游标,_cursor    例:emp_cursor

* pl/sql表类型,  _table_type       例:emp_table_type

* pl/slq表变量,  _table            例:emp_table

* pl/sql记录类型,_record_type      例:emp_record_type

* pl/sql记录变量,_record           例:emp_record

2、大小写规则.

* SQL关键字大写,          例:SELECT , FROM , WHERE

* PL/SQL关键字大写,       例:DECLARE, BEGIN, EXCEPTION ,END

* 数据类型大写,           例:INT, VARCHAR2, DATE

* 标识符、参数小写         例:v_sal, c_rate

* 数据库对象、列小写       例:emp、sal、ename

变量和类型. 数字数据类型,除 NUMBER之外,还有:

PLS_INTEGER,是专门为PL/SQL程序使用的数据类型,他不可以在创建表的列中使用。

PLS_INTEGER 数据类型 表示一个有符号整数, 表示的范围为-2的31次方  到 2的31次方。

PLS_INTEGER 具有比 NUMBER变量更小的表示范围,因此会占用更少的内存。

PLS_INTEGER更有效地利用CPU,因此其运算可以比 number 和binary_intege 更快

.

BINARY_INTEGER ,与 PLS_INTEGER 相似,比 NUMBER 变量需要的内存少。

二者的区别是:PLS_INTEGER进行的运算发生溢出时,常触发异常; 但是当 BINARY_INTEGER运算发生溢出时,如果可以指派给一个 NUMBER 变量(没有超出 NUMBER 的精度方位)则不会触发异常。

.

PL/SQL的注释:

单行:“—”.

多行:

.

条件分支语句:

1、 IF-THEN、 IF-THEN-ELSE、IF-THEN-ELSFI.

2、 CASE 语句

        当处理多重条件分支时, CASE 语句 更加简捷,而且执行效率也更好,所以建议使用 CASE 语句:

         CASE

         WHEN condition1 THEN statement1

         WHEN condition2 THEN statement2

         

         WHEN conditionN-1 THEN statementN-1

         [ELSE statementsN]

         END CASE;

sys@SDROLUN>DECLARE
 2    grade      CHAR(1)     := 'B';
 3    appraisal   VARCHAR2 (20);
  4  BEGIN
 5    appraisal:=                                               --输出结果赋值
 6       CASE grade
 7          WHEN 'A'
 8             THEN '优'
 9          WHEN 'B'
10             THEN '良'
11          WHEN 'C'
12             THEN '中'
13          WHEN 'D'
14             THEN '及格'
15          WHEN 'F'
16             THEN '不及格'
17          ELSE '没有这样的等级'
18       END;
19    DBMS_OUTPUT.put_line ('Grade' || grade || 'is' || appraisal);
20  END;
21  /
GradeBis良

PL/SQL 过程已成功完成。

NULL结构

PL/SQL 中一类特殊的结构,又称为 空操作 或空值结构。NULL结构表示什么都不做,起到占位符的作用。

sys@SDROLUN>DECLARE
 2    n   INTEGER := 0.5;
  3  BEGIN
 4    IF n > 1
 5    THEN
 6       NULL;
 7    ELSE
 8       DBMS_OUTPUT.put_line ('n is smaller than 1----------------');
 9    END IF;
10  END;
11  /
n is smaller than 1----------------

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01
sys@SDROLUN>DECLARE
 2    n   INTEGER := 2;
  3  BEGIN
 4    IF n > 1
 5    THEN
 6       NULL;
 7    ELSE
 8       DBMS_OUTPUT.put_line ('n is smaller than 1');
 9    END IF;
10  END;
11  /

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.00

另外,在PL/SQL中含有NULL的条件表达式,其运算结果总是NULL。

     对 NULL 施加逻辑运算符 NOT,其结果也总是 NULL。

     如果在 选择结构中条件表达式的值是 NULL,则相应的 THEN 语句不会被执行

     在 CASE 结构中,不能出现 WHEN NULL 这样的结构,而应该使用 IS NULL 子句

如果两个变量的值都为NULL,它们也是不相等的.

.

%TYPE变量

%ROWTYPE变量

PL/SQL记录:

sys@SDROLUN>   DECLARE
 2               TYPE emp_record_type IS RECORD (
 3                  NAME    emp.ename%TYPE,
 4                  salary   emp.sal%TYPE,
 5                  deptno   emp.deptno%TYPE
 6               );
 7               emp_record  emp_record_type;
 8            BEGIN
 9               SELECT ename,
10                      sal,
11                      deptno
12                 INTO emp_record
13                 FROM emp
14                WHERE empno = 7788;
15
16               DBMS_OUTPUT.put_line ('emp_record.name=' || emp_record.NAME);
17            END;
18  /
emp_record.name=SCOTT

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.00

 

sys@SDROLUN>   DECLARE
 2               TYPE emp_record_type IS RECORD (
 3                  NAME    emp.ename%TYPE,
 4                  salary   emp.sal%TYPE,
 5                  deptno   emp.deptno%TYPE
 6               );
  7
 8               emp_record  emp_record_type;
 9            BEGIN
10               SELECT ename, sal
11                 INTO emp_record.name, emp_record.salary
12                 FROM emp
13                WHERE empno = 7788;
14
15               DBMS_OUTPUT.put_line ('emp_record.name=' || emp_record.NAME);
16            END;
17  /
emp_record.name=SCOTT

PL/SQL 过程已成功完成。

.

PL/SQL集合

1、索引表.

      也称 PL/SQL表,用户处理 PL/SQL 数组的数据类型。

      索引表的高级之处在于,其元素个数没有限制,并且下标可以为 负值。

TYPE type_name IS TABLE OF element_type

[NOT NULL] INDEX BY key_type;

identifier type_name

1.1、索引表中使用 binary_integer 和pls_integer

DECLARE
   TYPE ename_table_type IS TABLEOF emp.ename%TYPE
     INDEX BY BINARY_INTEGER;

  ename_table  ename_table_type;
  c_empno      PLS_INTEGER     := 7788;
  c_empno2     PLS_INTEGER     := 7369;
BEGIN
   SELECT ename
    INTO ename_table (-1)
    FROM emp
    WHERE empno= c_empno;
   DBMS_OUTPUT.put_line(   '雇员号为'
                        || c_empno
                        || '的雇员名为:'
                        || ename_table (-1)
                       );
   SELECT ename
    INTO ename_table (2)
    FROM emp
    WHERE empno= c_empno2;
   DBMS_OUTPUT.put_line(   '雇员号为'
                        || c_empno2
                        || '的雇员名为:'
                        || ename_table (2)
                       );
END;

雇员号为7788的雇员名为:SCOTT
雇员号为7369的雇员名为:SMITH

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01

1.2、索引表中使用 varchar2

sys@SDROLUN>   DECLARE
 2               type area_table_type is table of number
 3               index by varchar2(10);
 4               area_table area_table_type;
 5            BEGIN
 6               area_table('北京'):=1;
 7               area_table('上海'):=2;
 8               area_table('广州'):=3;
 9               dbms_output.put_line('第一个元素:'||area_table.first);
10               dbms_output.put_line('最后一个元素:'||area_table.last);
11               dbms_output.put_line('下一个元素:'||area_table.next('北京'));
12            END;
13  /
第一个元素:北京
最后一个元素:上海
下一个元素:广州

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01

2、嵌套表.   ——下标从 0 开始,并且元素个数 无限制。可以 无序。

TYPE type_name IS TABLE OF element_type;

identifier type_name;

sys@SDROLUN>   DECLARE
 2               TYPE ename_table_type IS TABLE OF emp.ename%TYPE;
 4               ename_table  ename_table_type;
 5            BEGIN
 6               ename_table := ename_table_type ('MARY', 'LILI', 'TOM');--使用构造方法初始化嵌套表变量
 9               SELECT ename
10                 INTO ename_table (2)
11                 FROM emp
12                WHERE empno = 7788;
13
14               DBMS_OUTPUT.put_line ('雇员名:' || ename_table (2));
15            END;
16  /
雇员名:SCOTT

PL/SQL 过程已成功完成。

3、变长数组.

sys@>DECLARE
 2    TYPE ename_table_type IS VARRAY (20) OF emp.ename%TYPE;
  3
 4    ename_table  ename_table_type;
  5  BEGIN
 6    ename_table := ename_table_type ('MARY', 'LILI', 'KAR');
  7
 8    SELECT ename
 9      INTO ename_table (2)
10      FROM emp
11     WHERE empno = 7788;
12
13    DBMS_OUTPUT.put_line ('雇员名:' || ename_table (2));
14  END;
15  /
雇员名:SCOTT

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01

4、PL/SQL记录表.

sys@>DECLARE
 2    TYPE emp_table_type IS TABLE OF emp%ROWTYPE
 3       INDEX BYBINARY_INTEGER;                              --定义索引表类型
  4
 5    emp_table   emp_table_type;
  6  BEGIN
 7    SELECT *
 8      INTO emp_table (1)
 9      FROM emp
10     WHERE empno = 7788;
11
12    DBMS_OUTPUT.put_line ('雇员名:' || emp_table (1).ename);
13    DBMS_OUTPUT.put_line ('雇员工资:' || emp_table (1).sal);
14  END;
15  /
雇员名:SCOTT
雇员工资:3000

PL/SQL 过程已成功完成。.

5、集合方法.

函数:Exists()、count(), limit(),first(), next(), prior(), last()

过程:extend(), trim(),delete()

1. Exists()

      --用户确定集合元素是否存在,若存在,返回 TRUE; 不存在, 返回 FALSE。

sys@>DECLARE
 2    TYPE ename_table_type IS TABLE OF emp.ename%TYPE;
  3
 4    ename_table  ename_table_type;
  5  BEGIN
 6    IF ename_table.EXISTS (1)
 7    THEN                                      --判断ename_table中是否存在元素
 8       ename_table (1) := 'SCOTT';
 9    ELSE
10       DBMS_OUTPUT.put_line ('必须初始化集合元素');
11    END IF;
12  END;
13  /
必须初始化集合元素

PL/SQL 过程已成功完成。.

2.COUNT() 或 COUNT

sys@SDROLUN>DECLARE
 2    TYPE ename_table_type IS TABLE OF emp.ename%TYPE index bybinary_integer;
 3    ename_table  ename_table_type;
  4  BEGIN
 5    IF ename_table.EXISTS (1)
 6    THEN                                      --判断ename_table中是否存在元素
 7       ename_table (1) := 'SCOTT';
 8    ELSE
 9       DBMS_OUTPUT.put_line ('必须初始化集合元素');
10    END IF;
11
12    ename_table(-5) := 'SCOTT';
13    ename_table(1) := 'SMITH';
14    ename_table(5) := 'MARY';
15    ename_table(10):='BLACK';
16          DBMS_OUTPUT.put_line('该集合元素总个数为:'||ename_table.count());
17  END;
18  /
必须初始化集合元素
该集合元素总个数为:4

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01
sys@SDROLUN>DECLARE
 2    TYPE ename_table_type IS TABLE OF emp.ename%TYPE index bybinary_integer;
 3    ename_table  ename_table_type;
  4  BEGIN
 5    IF ename_table.EXISTS (1)
 6    THEN                                      --判断ename_table中是否存在元素
 7       ename_table (1) := 'SCOTT';
 8    ELSE
 9       DBMS_OUTPUT.put_line ('必须初始化集合元素');
10    END IF;
11
12    ename_table(-5) := 'SCOTT';
13    ename_table(1) := 'SMITH';
14    ename_table(5) := 'MARY';
15    ename_table(10):='BLACK';
16          DBMS_OUTPUT.put_line ('该集合元素总个数为:'||ename_table.count);
17  END;
18  /
必须初始化集合元素
该集合元素总个数为:4

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01

3. LIMIT()、LIMIT          --返回集合元素的最大个数。

sys@>declare
  2   typeename_table_type is varray(25) of emp.ename%TYPE;
  3  ename_table ename_table_type := ename_table_type('BOXUAN');
  4  begin
 5   DBMS_OUTPUT.PUT_LINE('-----该集合元素的最大个数:'||ename_table.limit);
  6  end;
  7  /
-----该集合元素的最大个数:25

PL/SQL 过程已成功完成。

4.first()   : 返回集合变量的第一个元素的下标

  last()    : 返回最后一个元素的下标

  prior()   : 返回当前集合元素的前一个元素的下标

  next()   :  返回当前集合元素的后一个元素的下标

sys@SDROLUN>DECLARE
 2    TYPE ename_table_type IS TABLE OF emp.ename%TYPE
 3       INDEX BY BINARY_INTEGER;
  4
 5    ename_table  ename_table_type;
  6  BEGIN
 7    IF ename_table.EXISTS (1)
 8    THEN                                      --判断ename_table中是否存在元素
 9       ename_table (1) := 'SCOTT';
10    ELSE
11       DBMS_OUTPUT.put_line ('必须初始化集合元素');
12    END IF;
13
14    ename_table (-5) := 'SCOTT';
15    ename_table (1) := 'SMITH';
16    ename_table (5) := 'MARY';
17    ename_table (10) := 'BLACK';
18    DBMS_OUTPUT.put_line ('第一个元素:' || ename_table.first);
19    DBMS_OUTPUT.put_line ('最后一个元素:' || ename_table.last);
20    DBMS_OUTPUT.put_line ('元素5的前一个元素:' || ename_table.prior(5));
21    DBMS_OUTPUT.put_line ('元素5的后一个元素:' || ename_table.next(5));
22  END;
23  /
必须初始化集合元素
     第一个元素:-5
     最后一个元素:10
     元素5的前一个元素:1
     元素5的后一个元素:10

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01

5、EXTEND().

该方法用于扩展集合变量的尺寸,并为它们增加元素。

注意,该方法只适用于 嵌套表 和 VARRAY。

该方法有 EXTEND、EXTEND(n)、EXTEND(n, i)3中调用格式。其中:

EXTEND  用于为集合变量增加一个NULL元素。

EXTEND(n) 用于为集合变量添加 n 个NULL元素。

EXTEND(n, i)用于为集合变量添加 n 个元素(元素值与第 i个元素相同)。

sys@>DECLARE
 2    TYPE ename_table_type IS VARRAY (20) OF VARCHAR2 (10);
  3
 4    ename_table  ename_table_type;
  5  BEGIN
 6    ename_table := ename_table_type ('MARY');
 7    ename_table.EXTEND (5,1);                        --为集合变量添加5个元素
 8    DBMS_OUTPUT.put_line ('元素总个数:' || ename_table.COUNT);
 9    DBMS_OUTPUT.put_line ('第一个元素:' || ename_table.FIRST);
10    DBMS_OUTPUT.put_line ('最后一个元素:' || ename_table.LAST);
11  END;
12  /
元素总个数:6
第一个元素:1
最后一个元素:6

PL/SQL 过程已成功完成。

TRIM()   TRIM(n).

sys@>DECLARE
 2    TYPE ename_table_type IS VARRAY (20) OF VARCHAR2 (10);
  3
 4    ename_table  ename_table_type;
  5  BEGIN
 6    ename_table := ename_table_type ('MARY');
 7    ename_table.EXTEND (5,1);                        --为集合变量添加5个元素
 8    DBMS_OUTPUT.put_line ('元素总个数:' || ename_table.COUNT);
 9    ename_table.trim(2); --删除两个元素
10    DBMS_OUTPUT.put_line ('元素总个数:' || ename_table.COUNT);
11  END;
12  /
元素总个数:6
元素总个数:4

PL/SQL 过程已成功完成。

DELETE()  DELETE(n)   DELETE(m,n).

sys@>DECLARE
 2    TYPE ename_table_type IS TABLE OF emp.ename%TYPE
 3       INDEX BY BINARY_INTEGER;
  4
 5    ename_table  ename_table_type;
  6  BEGIN
 7    ename_table (-5) := 'SCOTT';
 8    ename_table (1) := 'SMITH';
 9    ename_table (5) := 'MARY';
10    ename_table (10) := 'BLACK';
11    DBMS_OUTPUT.put_line ('第一个元素:' || ename_table.FIRST);
12    DBMS_OUTPUT.put_line ('最后一个元素:' || ename_table.LAST);
13    DBMS_OUTPUT.put_line ('元素5的前一个元素:' || ename_table.PRIOR (5));
14    DBMS_OUTPUT.put_line ('元素5的后一个元素:' || ename_table.NEXT (5));
15    ename_table.DELETE (5);
16    DBMS_OUTPUT.put_line ('元素总个数:' || ename_table.COUNT);
17  END;
18  /
第一个元素:-5
最后一个元素:10
元素5的前一个元素:1
元素5的后一个元素:10
元素总个数:3

PL/SQL 过程已成功完成。

已用时间:  00: 00: 00.01

游标.

1、使用 %ISOPEN 属性

DECLARE
   CURSOR emp_cursor
   IS
     SELECT *
       FROM emp;
BEGIN
   IF emp_cursor%ISOPEN
   THEN
     CLOSE emp_cursor;
   END IF;
END;

2、使用 %FOUND 属性

3、使用 %NOTFOUND 属性

4、使用 %ROWCOUNT 属性.

sys@>select count(*) from emp;

  COUNT(*)
----------
       14

已用时间:  00: 00: 00.00
sys@>DECLARE
 2    CURSOR emp_cursor
 3    IS
 4       SELECT *
 5         FROM emp;
  6
 7    rec_emp   emp%ROWTYPE;
  8  BEGIN
 9    OPEN emp_cursor;
10
11    LOOP
12       FETCH emp_cursor
13        INTO rec_emp;
14
15       EXIT WHEN emp_cursor%NOTFOUND;
16    END LOOP;
17
18    DBMS_OUTPUT.put_line ('rowcount:' || emp_cursor%ROWCOUNT);
19
20    CLOSE emp_cursor;
21  END;
22  /
rowcount:14

PL/SQL 过程已成功完成。

游标 FOR 循环.

sys@>DECLARE
 2    CURSOR emp_cursor
 3    IS
 4       SELECT *
 5         FROM emp;
  6  BEGIN
 7    FOR emp_record IN emp_cursor
 8    LOOP
 9       DBMS_OUTPUT.put_line ('第' ||emp_cursor%ROWCOUNT||'个雇员:'||emp_record.ename);
10    END LOOP;
11  END;
12  /
第1个雇员:SMITH
第2个雇员:ALLEN
第3个雇员:WARD
第4个雇员:JONES
第5个雇员:MARTIN
第6个雇员:BLAKE
第7个雇员:CLARK
第8个雇员:SCOTT
第9个雇员:KING
第10个雇员:TURNER
第11个雇员:ADAMS2
第12个雇员:JAMES2
第13个雇员:FORD2
第14个雇员:MILLER

PL/SQL 过程已成功完成。.

使用游标变量.

1、声明游标变量

TYPE cursor_variable_type IS REF CURSOR[RETURN return_type];

2、使用游标变量

OPEN cursor_variable FORSELECT;

3、异常函数

SQLERRM---错误信息

.

.

.

.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值