7.5 PL/SQL中使用DML和DDL语言

PL/SQL当中除了可以执行查询语句外,也允许执行DML语言和DDL语言。结构控制和DML操作相结合能帮助我们完成很多复杂的业务。不过在PL/SQL中DML语言和DDL语言这两者的执行方式有所差异。

7.5.1 DML语句的使用

由于PL/SQL对标准SQL的兼容,PL/SQL当中允许使用SQL命令,但有些命令在使用方式上有所改变。DML语句在PL/SQL中的使用方式和单独执行DML操作没有区别,而SELECT和DDL的使用方式都有所改变。

【示例22】INSERT语句示例

要求判断产品类型编码是否存在,如果不存在,则增加该编码类型的记录。脚本如下:


01 DECLARE

02 v_catgid VARCHAR2(10):=0;

03 v_bol BOOLEAN:=TRUE;

04 BEGIN

05 SELECT CATEGORYID INTO v_catgid

06 FROM CATEGORYINFO

07 WHERE CATEGORYNAME='电脑';

08 DBMS_OUTPUT.PUT_LINE('电脑对应的编码存在:'||v_catgid);

09

10 EXCEPTION

11 WHEN NO_DATA_FOUND THEN

12 IF v_bol THEN

13 DBMS_OUTPUT.PUT_LINE('没有对应的编码,为其增加该产品类型');

14 INSERT INTO CATEGORYINFO VALUES('0100000001','电脑');

15 COMMIT;

16 END IF;

17 WHEN TOO_MANY_ROWS THEN

18 DBMS_OUTPUT.PUT_LINE('对应数据过多,请确认!');

19 END;

20 /


【代码解析】

❑第5~7行查询产品类型名称为“电脑”的产品类型编码。如果对应编码存在,则将对应的编码输出到屏幕。如果不存在,在SELECT…INTO类型语句中会引发NO_DATA_FOUND异常,程序流程会发生跳转。此时会增加产品类型“电脑”对应的产品类型编码。

❑第10行开始属于PL/SQL块的异常部分。

❑第11行的NO_DATA_FOUND是Oracle的预定义异常,这在后面的相关章节会做介绍。

❑第14行表示,当CATEGORYINFO表中没有对应记录时,会增加该记录。该语句只能在触发NO_DATA_FOUND异常时才会被执行。

❑第15行表示提交事务,否则由于数据库的一致性,其他的用户将看不到该记录。关于事务,后面章节会有详细介绍。

❑第17行,TOO_MANY_ROWS是SELECT…INTO语句可能引发的另一个异常,返回多条记录时,会触发该异常。

【执行效果】

在SQL*Plus中执行以上脚本,并做查询,查看数据是否已经存入到表CATEGORYINFO中。执行过程见图7.27。

7.5 PL/SQL中使用DML和DDL语言 - 图1

图 7.27 PL/SQL结构语句中使用DML语句

从图7.27中可以看出数据已经成功添加到数据库中,说明在PL/SQL和在条件控制语句中执行DDL操作都没有问题,而且查询和DML操作是在PL/SQL块中最常用的操作方式。

注意 SELECT…INTO语句是SELECT语句在PL/SQL中的使用方法。