Oracle数据库--实用操作(3) PL/SQL

来源:互联网 发布:淘宝卖家怎么查访客 编辑:程序博客网 时间:2024/05/19 01:29

                                Oracle----PL/SQL                        

PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言

PL/SQL 是Oracle特有的,是对 SQL 的扩展。不同数据库厂商都有类似的“方言”,提供的新特性。

支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构

可用于创建存储过程、触发器和程序包,给SQL语句的执行添加程序逻辑

与Oracle 服务器和Oracle 工具紧密集成,具备可移植性、灵活性和安全性

PL/SQL 的优点

支持 SQL,在 PL/SQL 中可以使用:

–  数据操纵命令

–  事务控制命令

–  游标控制

–  SQL 函数和SQL 运算符

支持面向对象编程 (OOP)

可移植性,可运行在任何操作系统和平台上的Oralce数据库

更佳的性能,PL/SQL 经过编译执行

 

PL/SQL体系结构


PL/SQL[代码]是构成 PL/SQL 程序的基本单元

将逻辑上相关的声明和语句组合在一起

PL/SQL 分为三个部分,声明部分、可执行部分和异常处理部分

 

PL/SQL中的复合符号

:=        赋值操作符

||         连接操作符

--        单行注释

/**/      多行注释

<<>>  标签分隔符

..         范围操作符

**        求幂操作符

变量和常量

PL/SQL 块中可以使用变量和常量

1.  在声明部分声明,使用前必须先声明

2.  声明时必须指定数据类型,每行声明一个标识符

3.  在可执行部分的SQL 语句和过程语句中使用

声明变量和常量的语法:

identifier [CONSTANT] datatype[NOT NULL]  

                   [:= |DEFAULT expr];

给变量赋值有两种方法:

1使用赋值语句:=

2使用 SELECTINTO 语句

DECLARE

  icode VARCHAR2(6);

  p_catg VARCHAR2(20);

  p_rate NUMBER;

  c_rate CONSTANT NUMBER :=0.10;

BEGIN

  ...

  icode := 'i205';

  SELECT p_category, itemrate* c_rate

  INTO  p_catg, p_rate

  FROM itemfile WHERE itemcode= icode;

  ...

END;

DECLARE vv number:=100;   --匿名代码块,不会保存

Begin

  SELECT SAL into vv  from emp where ename='KING';                 --查出KING的工资,并赋值给vv变量

 

  DBMS_OUTPUT.PUT_LINE('SAL'||vv);   --控制台输出

end;

数据类型


数字数据类型


字符数据类型

字符数据类型包括:

1.  CHAR

2.  VARCHAR2

3.  LONG

4.  RAW

5.  LONG RAW

日期时间类型

1.       存储日期和时间数据

2.       常用的两种日期时间类型

①  DATE

②  TIMESTAMP

布尔数据类型

1.       此类别只有一种类型,即BOOLEAN类型

2.       用于存储逻辑值(TRUE、FALSE和NULL)

3.       不能向数据库中插入BOOLEAN数据

4.       不能将列值保存到BOOLEAN变量中

5.       只能对BOOLEAN变量执行逻辑操作

LOB  数据类型

用于存储大文本、图像、视频剪辑和声音剪辑等非结构化数据。

LOB 数据类型可存储最大 4GB的数据。

LOB 类型包括:

6.       BLOB   将大型二进制对象存储在数据库中

7.       CLOB   将大型字符数据存储在数据库中

8.       NCLOB   存储大型UNICODE字符数据

9.       BFILE     将大型二进制对象存储在操作系统文件中

属性类型

用于引用数据库列的数据类型,以及表示表中一行的记录类型

属性类型有两种:

1.       %TYPE -  引用变量和数据库列的数据类型

2.       %ROWTYPE -  提供表示表中一行的记录类型

使用属性类型的优点:

1.       不需要知道被引用的表列的具体类型

2.       如果被引用对象的数据类型发生改变,PL/SQL 变量的数据类型也随之改变

逻辑比较

逻辑比较用于比较变量和常量的值,这些表达式称为布尔表达式

布尔表达式由关系运算符与变量或常量组成

控制结构

PL/SQL 支持的流程控制结构:

•  条件控制

–  IF 语句

–  CASE 语句

•  循环控制

–  LOOP 循环

–  WHILE 循环

–  FOR 循环

•  顺序控制

–  GOTO 语句

–  NULL 语句

•  循环控制用于重复执行一系列语句

•  循环控制语句包括:

–  LOOP、EXIT 和EXIT WHEN

•  循环控制的三种类型:

–  LOOP   -   无条件循环

–  WHILE  -  根据条件循环

–  FOR  -  循环固定的次数

      loop...exit...when...endloop循环控制

采用loop...exit...when...end loop循环控制的语法结构如下所示:

loop

         循环体;

         exitwhen循环条件;

end loop

      while...loop...end loop循环控制

这种循环控制的语法如下:

while 条件

loop

         执行语句段;

end loop;

例:

Declare counter number:=0;

Begin

loop     --[无条件]循环

exit when counter>10;

DBMS_OUTPUT.PUT_LINE('lplpl'||counter);

counter:=counter+1;

 

end loop;

end;

……………………………………………………

Declare counter number:=0;

Begin

 while counter<9 loop    --先判断,再执行循环

 DBMS_OUTPUT.PUT_LINE('lplpl'||counter);

counter:=counter+1;

  endloop;

end;

 

…………………………………………………………..

Declare i number:=0;

Begin

  forx in 1..9 loop  --for循环:x在1-9则循环

   DBMS_OUTPUT.PUT_LINE('lplpl'||x);

  

  endloop;

 

end;

CASE 语句用于根据单个变量或表达式与多个值进行比较

执行 CASE 语句前,先计算选择器的值

BEGIN

   CASE ‘&grade’

     WHEN ’A’ THEN DBMS_OUTPUT.PUT_LINE(’优异’);

     WHEN ’B’ THEN DBMS_OUTPUT.PUT_LINE (优秀’);

     WHEN ’C’ THEN DBMS_OUTPUT.PUT_LINE (’良好’);

     WHEN ’D’ THEN DBMS_OUTPUT.PUT_LINE (’一般’);

     WHEN ’F’ THEN DBMS_OUTPUT.PUT_LINE (’较差’);

     ELSE DBMS_OUTPUT.PUT_LINE (’没有此成绩’);

   END CASE;

END;

错误处理

•  在运行程序时出现的错误叫做异常

•  发生异常后,语句将停止执行,控制权转移到 PL/SQL 块的异常处理部分

•  异常有两种类型:

–      预定义异常 -  当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发

–      用户定义异常  -  用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发

处理预定义异常

access_into_null 在未初化对象时出现

case_not_found 在CASE语句中的选项与用户输入的数据不匹配时出现

collection_is_null 在给尚未初始化的表或数组赋值时出现

cursor_already_open 在用户试图打开已经打开的游标时出现

dup_val_on_index 在用户试图将重复的值存在使用唯一索引的数据库列中时出现

invalid_cursor 在执行非法游标运算(如打开一个尚未打开的游标)时出现

invalid_number 在将字符串转换为数字时出现

login_denied 在输入的用户名或密码无效时出现

no_data_found 在表中不存在的请求的行时出现,此外,当程序引用已经删除的元素时

storage_error 在内存损坏或PL/SQL耗尽内存时出现

too_many_rows 在执行SELECTINTO语句后返回多行时出现

value_error 在产生大小限制错误时出现

zero_divide 以零作除数时出现

Others针对所有异常

 

处理用户定义异常

DECLARE

 invalidCATEGORY EXCEPTION;

 category VARCHAR2(10);

BEGIN

 category := '&Category';

  IFcategory NOT IN ('附件','顶盖','备件') THEN

   RAISE invalidCATEGORY;

 ELSE

   DBMS_OUTPUT.PUT_LINE('您输入的类别是'|| category);

  ENDIF;

EXCEPTION

 WHEN invalidCATEGORY THEN

    DBMS_OUTPUT.PUT_LINE('无法识别该类别');

END;

 

DECLARE

 rate itemfile.itemrate%TYPE;

 rate_exception EXCEPTION;

BEGIN

 SELECT NVL(itemrate,0) INTO rate FROM itemfile

 WHERE  itemcode = 'i207';

  IFrate = 0 THEN

   RAISE rate_exception;

 ELSE

   DBMS_OUTPUT.PUT_LINE('项费率为:' || rate);

  ENDIF;

EXCEPTION

 WHEN rate_exception THEN

   RAISE_APPLICATION_ERROR(-20001, '未指定项费率');

END;

 

总结:

      PL/SQL 是一种可移植的高性能事务处理语言

      PL/SQL 引擎驻留在 Oracle 服务器中

      PL/SQL 块由声明部分、可执行部分和异常处理部分组成

      PL/SQL 数据类型包括标量数据类型、LOB数据类型和属性类型

      控制结构包括条件控制、循环控制和顺序控制

      PL/SQL 支持动态 SQL

      运行时出现的错误叫做异常

      异常可以分为预定义异常和用户定义的异常


1 0
原创粉丝点击