PLSQL之DML和记录
从Oracle 9i Release2开始,你就可以在insert和update语句中使用记录了。比如下面的代码例子:
CREATE OR REPLACE PROCEDURE SET_BOOK_INFO ( BOOK_IN IN BOOKS%ROWTYPE ) IS BEGIN INSERT INTO BOOKS VALUES BOOK_IN ; EXCEPTION WHEN DUP_VAL_ON_INDEX THEN UPDATE BOOKS SET ROW = BOOK_IN WHERE ISBN = BOOK_IN.ISBN ; END ;
这样带来的好处有两个:
1.简化代码,用时髦的话说,就是把代码提高到了“记录层”。
2.增加了程序的健壮性,使用“%ROWTYPE”,当表结构发生变化时,需要维护的地方就少一些。
具体应用:
1.基于“记录”(record)的INSERT语句
你能够声明一个基于某张表的记录变量,然后直接把这个变量的值插入到表里去。
需要注意的是,在INSERT语句中的VALUES子句后面是不能跟“()”的,而且记录变量的结构必须和表结构完全一致。
declare my_dept dept%rowtype; begin my_dept.deptno := 60; my_dept.dname := 'myDept'; my_dept.loc := 'tcy'; insert into dept values my_dept; end;
2.基于“记录”(record)的UPDATE语句
同插入语句一样,你也可以使用记录变量对整条记录进行更新。有两点关于利用记录变量更新数据表的限制:
1.你必须使用ROW语法来更新整个记录,不能仅仅更新某些字段组。
2.在更新语句中不能使用子查询。
declare my_dept dept%rowtype; begin my_dept.deptno := 60; my_dept.dname := 'myDept'; my_dept.loc := 'TCY'; update dept set row = my_dept where deptno = 60; end;
3.记录变量与RETURNING子句结合使用
如果DML语句影响了一条记录,你可以把这条记录的数值返回给一个记录或者组合变量。如下代码所示:
declare my_dept dept%rowtype; my_ret_dept dept%rowtype; begin my_dept.deptno := 60; my_dept.dname := 'myDept'; my_dept.loc := 'TCY'; update dept set row = my_dept where deptno = 60 returning deptno,dname,loc into my_ret_dept; dbms_output.put_line(my_ret_dept.loc); end;
在RETURNING子句中,必须把每个列名写出来,因为Oracle还没有支持“*”的写法。
使用记录变量来插入或更新,需要注意以下几点:
1.在SET子句的左边,你必须使用ROW关键字。而且不能有其他的SET子句 ,也就是说,你不能在更新一条记录的同时更新一个单独的列。
2.如果你插入一条记录时,不能只给某个单独列赋值。
3.你不能插入或更新一个含有内嵌记录的记录变量。
4.你不能在动态SQL的DML语句中使用记录变量。因为这需要Oracle支持PL/SQL记录类型和SQL语句的绑定,目前只支持SQL类型的绑定。

浙公网安备 33010602011771号