PLSQL编程简介

    科技2022-07-10  104

    1.1 简介PL/SQL

    PL/SOL(Procedural Language/SQL,过程语言/SQL)是结合了Oracle过程语言和结构化查询语言(SQL)的一种扩展语言。使用PL/SQL可以编写具有很多高级功能的程序,虽然通过多个 SQl语句也能实现同样的功能,但是相比而言,PL/SQL具有更为明显的一些优点。

    (1)PL/SOL具有编程语言的特点,它能把一组SQL语句放到一个模块中,使其更具模块化程序的特点。

    (2)PL/SQL可以采用过程性语言控制程序的结构,也就是说,我们可以在PL/SQL中增加逻辑结构,如判断、循环等程序结构。

    (3)同其他的编程语言一样,PL/SQL可以对程序中的错误进行自动处理.使程序能够在遇到错误时不会中断,即它的异常处理机制。

    (4)PL/SQL程序块具有更好的可移植性,可以移植到另一个Oracle数据中。

    (5)PL/SQL程序减少了网络的交互,有助于提高程序性能。

    PL/SQL体系结构

    PL/SQL引擎用来编译和执行PL/SQL块或子程序,该引擎驻留在 Oracle 服务器中。PL/SQL引擎仅执行过程语句,而将 SQL语句发送给 Oracle 服务器上的SOL语句执行器,由 SQL语句执行器执行这些SQL语句。PL/SQL体系结构如图以下所示。

    2.PL/SQL块简介

    PL/SQL是一种块结构的语言,它将一组语句放在一个块中。PL/SQL块将逻辑上相关的声明和语句组合在一起。匿名块是一个未在数据库中命名的PL/SQL块,在运行时被传递到PL/SQL引擎以便执行。在PL/SQL 块中可以使用 SELECT、INSERT、UPDATE、DELETE 等DML语句、事务控制语句及SQL函数等。PL/SQL块中不允许直接使用CREATE,DROP或ALTER等DOL语句,但可以通过动态SQL来执行它们。

    2.1 运算符和表达式

    运算符意义=等于<>,!=,~=,^=不等于<小于>大于<=大于或等于>=大于或等于 一般运算符 运算符意义+加号-减号*乘号/除号:=赋值号=>关系号…范围运算符11字符连接符 逻辑运算符 IS NULL是空值BETWEEN AND介于俩者之间IN在一列值中间AND逻辑与RO逻辑或NOT取反,如IS NOT NULL, NOT IN * PL/SQL 程序设计中的标识符定义与SQL的标识符的要求相同,要求限制 如下: * 标识符名不能超过30个字符 * 第一个字符必须为字母 * 不区分大小写 * 不能用"-"(减号) * 不能是SQL保留字

    3.1 PL/SQL数据类型

    标量数据类型 类 型子 类说 明范 围CHARCharacter Nchar定长字符串 民族语言字符集0~32767 可选,默认为1VARCHAR2Varchar String NVARCHAR2可变字符串 民族语言字符集0~32767BINARY_INTEGER带符号整数,为整数计算优化性能NUMBER(p,s)Dec Double Precision Integer Int Numeric Real Small int小数,NUMBER的子类型 高精度实数 整数,NUMBER的子类型 整数,NUMBER的子类型 与 NUMBER 等价 与 NUMBER 等价 整数,比Integer 小LONG变长字符串0~2147483647DATE日期型公元前4712年1月1日至公元后 4712年12月31日BOOLEAN布尔型TRUE,FALSE,NULL 1.LOB数据类型 * Oracle 提供了 LOB(Large Object) 类型,用于存储大的数据对象的类型。Oracle 目前主要支持BFILE、BLOB、CLOB 及NCLOB 类型。 2.属性类型 属性用于引用变量或数据库列的数据类型,以及表示表中一行的记录类型。PL_/SOL支持以下两种属性类型: (1) %TYPE 定义一个变量,其数据类型与已经定义的某个数据变量(尤其是表的某一列)的数据类型相一致.这时可以使用%TYPE. * 使用%TYPE属性的优点在于: (1)可以不必知道所引用的数据库列的数据类型。 (2)所引用的数据库列的数据类型可以实时改变,容易保持一致,不用修改PL/SQL程序。 (2)%ROWTYPE 返回一个记录类型,其数据类型和数据库表的数据结构相一致,这时可以使用%ROWTYPE. * 使用%ROWTYPE属性的优点在于: (1)可以不必知道所引用的数据库中列的个数和数据类型。 (2)所引用的数据库中列的个数和数据类型可以实时改变,容易保持一致,不用修改PL/SQL程序。

    3.2 PL/SQL控制语句

    1 添加控制 条件控制用于根据条件执行一系列语句。条件控制包括IF语句和CASE语句。 IF语句语法如下:

    IF (a <= 20) THEN b:= b+1; END IF;

    2循环控制 循环控制用于重复执行一系列语句,据环按制包括LOoP和EXIT语句,使用EXIT语句可以立的退出循环:使用EXIT WHEN语句可以根据条件结束循环。 循环共有三种类型,包括LOOP循环、WHILE 循环和FOR循环。 LOOP循环语法如下:

    LOOP循环语句如:

    WHILE循环语句如: FOR循环语句如:

    3顺序控制

    顺序控制用于按顺序执行语句。顺序控制包括NUL语句和GOTO语句。GOTO语句不推荐使用. 下面介绍NULL语句: 1.NUL语句:NULL语句是一个可执行语句,相当于一个占位符或不执行任何操作的空语句. 2.它可以使某些语句变得有意义,提高程序的可读性,保证其他语句结构的完整性和正确性。

    4.0异常处理

    在运行程序时出现的错误叫做异常,发生异常后,语句将停止执行、PL/SOL引擎立即将控制权转到入/SOL.块的异常处理部分,值得注意的是PL/SQL编泽铺误发生在入PLSOL.程序执行之前,因此不能由PL/SQL异常处理部分来处理。 异常情况处理(EXCEPTION)用来处理正常执行过程中未预料的事件,这里介绍两种比较典型的,即预定义异常和用户自定义异常。

    4.1 预定义异常

    0acle预定义的异常情况大约有24个,对于这种异常情况的处理,无须在程序中定义,可由Oracle自动引发,常见的预定义异常如以下所示: 异 常说 明ACCESS_INTO_NULL在未初始化对象时出现CASE_NOT_FOUNDCASE语句中的选项与用户输入的数据不匹配时出现COLLECTION _IS_NULL给尚未初始化的表或数组赋值时出现CURSOR_ALREADY_OPEN在用户试图重新打开已经打开的游标时出现。在重新打开游标前必须先将其关闭DUP _VAL ON INDEX在用户试图将重复的值存储在使用唯一索引的数据库列中时出现INVALID_CURSOR在执行非法游标运算(如打开一个尚未打开的游标)时出现INVALID _NUMBER在将字符串转换为数字时出现LOGIN _DENIED在输入的用户名或密码无效时出现NO_DATA_FOUND在表中不存在请求的行时出现。此外,当程序引用已经删除的元素时,也会引发NO_DATA FOUND异常STORAGE_ ERROR在内存损坏或PL/SQL耗尽内存时出现TOO_MANY_ROWS在执行SELECT INTO 语句后返回多行时出现VALUE_ERROR在产生大小限制错误时出现。例如,变量中的列值超出变量的大小ZERO _DIVIDE以零作为除数时出现

    4.2 处理用户自定义异常

    程序在执行过程中,出现编程人员认为的非正常情况。对于这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。用户定义的异常错误通过显式使用RAISE语句来触发。当引发一个异常错误时,控制就转到EXCEPTION块异常错误部分,执行错误处理代码。 对于这类异常情况的处理,步骤如下.

    * 在PL/SQL块的定义部分定义异常情况: <异常情况> EXCEPTION; * 抛出异常情况 RAISE <异常情况>; * 在PL/SQL块的异常情况处理部分对异常情况做出相应的处理.

    5.0 游标

    游标的基本原理 在Crecle 中,在执行一个有 SELECT、NSERT、UPDATE和 DELETE 语句的PL/SOL 块时,Orecle会在内存中为其分配一个缓冲区,将执行结果放在这个缓冲区中,而游标是指向该区的一个指针。 游标为应用程序提供了一种对多行数据查询结果集中的每行数据进行单独处理的方法,是设计嵌入式SQL语句的应用程序的常用编程方式,如图以下所示:

    5.2 游标的使用步骤

    第一步:定义游标

    第二步:打开游标

    第三步:提取数据

    第四步:关闭游标

    声明游标的语法如: CURSOR cursor_name [(parameter [,parameter]...)] [RETURN return_type] IS select_statement; cursor_name指游标的名称 parameter 用于为游标指定输入参数.在指定数据类型时,不能使用长度约束,如: NUMBER(4),CHAR(10) 等都是错误的. return_type用于定义游标提取的行的类型 select_statemernt 指游标定义的查询语句 打开游标语法如: OPEN cursor_name[(parameters)]; 提取游标的语法如: FETCH cursor_name INTO variables; cursor_name指游标的名称 variables是变量名 关闭游标的语法如: CLOSE cursor_name;
    Processed: 0.017, SQL: 8