retek中收藏的一段实现on-insert、on-delete、on-update、on-lock代码

下面这段代码是我在retek中找到的一段代码,这里是用一个包封装起来的,由于在开发Form的时候,经常会要写上on-insert、on-delete、on-update、on-lock这几个触发器,下面这段代码不可不谓之重要,代码是死的,人是活的,下面的代码仅作参考使用。

(Retek中的代码已删除,可参考《EBS中收藏的一段实现on-insert、on-delete、on-update、on-lock代码》)

上面的代码封装好以后,实现的时候,直接在on-insert、on-update、on-lock、on-delete中调用Req_detail_private.insert_row、Req_detail_private.update_row、Req_detail_private.lock_row、Req_detail_private.delete_row即可。

函数、存储过程中in、out的用法

图1:函数、存储过程中in、out的用法

对于函数(function)、存储过程(procedure)中in、out的用法,可参见上图1所示。

补充:

上面的代码中涉及到了SQL%NOTFOUND和CURSOR%NOTFOUND这两种常见的NOTFOUND用法,它们分别表示的意义是怎样的呢?

(1)SQL%NOTFOUND

SQL%NOTFOUND的返回值是一个布尔值,即false或者true。当最近一次使用增删改查(insert、delete、update、select)的时候,如果该操作没有涉及到任何一行,即类似于select * from table_name where 1 = 2,那么SQL%NOTFOUND的返回值就会是true。还有下面一个比较明显的例子:

BEGIN
  UPDATE salary SET bonus = 1000 WHERE 1 = 2;
  IF SQL%NOTFOUND THEN
    RAISE e_noteffact;
  END IF;
END;

很明显上面例子中的update不能对任何记录操作,所以SQL%NOTFOUND为true,即开始执行IF后面的操作。

与SQL%NOTFOUND类似的还有SQL%ROWCOUNT、SQL%FOUND、SQL%ISOPEN,其中SQL%ROWCOUNT表示受最近的SQL语句影响的行数,SQL%FOUND表示最近的SQL语句是否影响了一行以上的数据,SQL%ISOPEN对于隐式游标而言始终为false,实际上oracle数据库使用隐式游标来解析和执行我们提交的SQL语句,例如update、delete等。

(2)CURSOR%NOTFOUND

CURSOR%NOTFOUND与SQL%NOTFOUND类似,用它来判断游标的记录是否被取完,当被取完的时候CURSOR%NOTFOUND的返回值为true。曾经上课的时候,有这样一个讨论,使用fetch获取游标值的时候,它的运作是怎样的,在我觉得大概是这样的。当定义一个游标的时候,啥也没有发生,使用open打开游标,此时游标指向记录头(不指向任何记录,指向记录的头部),而且此时CURSOR%NOTFOUND的返回值既不是true也不是false,而是null;当使用fetch获取游标记录的时候,每fetch一次,游标也往下移动一个位置,然后取得当前位置的记录(是先移动,后取值),此时,只要还能取到值,那么CURSOR%NOTFOUND的返回值都是false;当游标指向最后一条记录的时候,此时再fetch一次,那么游标指向尾部,取不到任何记录,此时CURSOR%NOTFOUND为true,表示游标数据已经被取完,此时使用exit退出游标循环。

本文标题:retek中收藏的一段实现on-insert、on-delete、on-update、on-lock代码

本文链接:http://yedward.net/?id=108

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

相关文章