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类型的绑定。

 

posted @ 2013-04-25 15:11  tcy1209  Views(361)  Comments(0)    收藏  举报