从SQL调用自治函数
从SQL语句调用的函数必须遵守意在控制副作用的规则。为了检测对规则的违背,要使用RESTRICT_REFERENCES编译指示。该编译指示警告函数没有读写数据库表或包变量。
根据定义,自治程序永远不会违背read no database state(RNDS)和write no database state(WNDS)
DROP TABLE debug_output; CREATE TABLE debug_output (message VARCHAR2(200));
CREATE OR REPLACE PACKAGE debugging AS FUNCTION log_msg (msg VARCHAR2) RETURN VARCHAR2; PRAGMA RESTRICT_REFERENCES(log_msg, WNDS, RNDS); --编译指令 END debugging; / CREATE OR REPLACE PACKAGE BODY debugging AS FUNCTION log_msg (msg VARCHAR2) RETURN VARCHAR2 IS PRAGMA AUTONOMOUS_TRANSACTION; --自治函数 BEGIN
--插入不会违背WNDS规则,因为这是一个自治程序 INSERT INTO debug_output (message) VALUES (msg);
COMMIT; RETURN msg; END; END debugging; / --从查询调用包函数 DECLARE my_emp_id NUMBER(6); my_last_name VARCHAR2(25); my_count NUMBER; BEGIN my_emp_id := 120;
SELECT debugging.log_msg(last_name) INTO my_last_name FROM employees WHERE employee_id = my_emp_id; dbms_output.put_line(my_last_name); --即使执行了回滚操作,但插入到debug_output中的信息仍然存在 --因为它是自治事务的一部分 ROLLBACK; END; / SELECT * FROM debug_output;
|
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17013648/viewspace-1123726/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17013648/viewspace-1123726/