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.27 PL/SQL结构语句中使用DML语句
从图7.27中可以看出数据已经成功添加到数据库中,说明在PL/SQL和在条件控制语句中执行DDL操作都没有问题,而且查询和DML操作是在PL/SQL块中最常用的操作方式。
注意 SELECT…INTO语句是SELECT语句在PL/SQL中的使用方法。