使用PRAGMA-我

本文深入探讨了Oracle PL/SQL中的PRAGMA指令,特别是AUTONOMOUS_TRANSACTION指令的使用,展示了如何创建独立于主事务的子程序,允许在子程序中提交或回滚数据,而不影响主事务的状态。通过多个示例代码,如触发器和过程,详细解释了其功能和限制。

PRAGMA:-表示该语句是编译指示(编译器指令)。 编译是在编译时而不是运行时处理。 它们将信息传递给编译器。

编译指示是对Oracle编译器的一条指令,告诉它执行某项操作。 在这种情况下,您要告诉Oracle将选择的错误与选择的变量相关联。 此实用程序必须放在块的声明部分。

PRAGMA的类型

1.AUTONOMOUS_TRANSACTION

2.EXCEPTION_INIT

3.RESTRICT_REFERENCES

4.SERIALLY_REUSABLE

AUTONOMOUS_TRANSACTION编译指示会更改子程序在事务中的工作方式。 带有此编译指示的子程序可以执行SQL操作并提交或回滚这些操作,而无需提交或回滚主事务中的数据。

只需检查此示例代码


CREATE OR REPLACE PROCEDURE DEPTINS
(
DNO DEPT.DEPTNO%TYPE,
DN DEPT.DNAME%TYPE,
LC DEPT.LOC%TYPE
)
AUTHID CURRENT_USER
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO DEPT VALUES(DNO,DN,LC);
DBMS_OUTPUT.PUT_LINE('ONE ROW INSERTED......!');
COMMIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('DUPLICATE VALUE......!');
END; 
AUTONOMOUS_TRANSACTION杂指令指示plsql编译器将例程标记为自主(独立)。at是由另一个事务(即主事务)启动的独立事务。它使用户可以挂起主事务和所有sql操作,提交或回滚这些操作,然后恢复主要交易。

限制:

不能使用Pragma将包中的所有子程序标记为自主程序,只能将单个例程标记为自主程序,可以在子程序的声明部分中的任何位置进行编码。

一旦启动,自治事务便是完全独立的,它与主事务不共享锁,资源或提交依赖关系。

优点:-

与常规触发器不同,自主触发器可以包含COMMIT和ROLLBACK。

请查看此示例触发代码。


create or replace trigger mytrig
before insert on emp
declare
pragma autonomous_transaction;
begin
if to_char(sysdate,'d') in(1,7) then
insert into  trace values(user,systimestamp);
commit;
Raise_application_error(-20004,'Cannot do manipulation today');
end if;
end; 
它们也可以使用本机动态SQL执行DDL语句。

create or replace trigger scotttrig
after logon on scott.schema
declare
pragma autonomous_transaction;
begin
if to_char(sysdate,'dy') in('sun','sat') then
--this is not supported in normal triggers without using PRAGMA.
execute immediate 'create table logtable(id varchar2(10),dt date)';
execute immediate 'insert into logtable values(user,sysdate)';
commit;
Raise_application_error(-20004,'Cannot do LOGIN today');
end if;
end; 
局限性:

在at提交时,at所做的更改对其他事务可见。在主事务恢复时,更改也对主事务可见。

如果at试图访问由主事务持有的资源(直到at例程退出才能恢复),则可能发生交易锁定。在这种情况下,Oracle在at处引发异常,如果用户试图退出at如果没有COMMIT或ROLLBACK,ORACLE会引发异常,在两种情况下,如果未处理异常,事务都会回滚。


CREATE OR REPLACE PROCEDURE 
   update_salary (dept_in IN NUMBER)
IS
   PRAGMA AUTONOMOUS_TRANSACTION; 
   CURSOR myemps IS
      SELECT empno FROM emp
       WHERE deptno = dept_in
         FOR UPDATE NOWAIT;
BEGIN
   FOR rec IN myemps
   LOOP
      UPDATE emp SET sal = sal * 2 
       WHERE empno = rec.empno;
   END LOOP;
   COMMIT;
END;
------------
BEGIN
   UPDATE emp SET sal = sal * 2;
   update_salary (10);
END; 

CREATE TRIGGER parts_trig
BEFORE INSERT ON parts FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO parts_log VALUES(:new.pnum, :new.pname);
COMMIT;
END; 

还要检查

使用PRAGMA-II

From: https://bytes.com/topic/oracle/insights/774899-using-pragma-i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值