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-IIFrom: https://bytes.com/topic/oracle/insights/774899-using-pragma-i
本文深入探讨了Oracle PL/SQL中的PRAGMA指令,特别是AUTONOMOUS_TRANSACTION指令的使用,展示了如何创建独立于主事务的子程序,允许在子程序中提交或回滚数据,而不影响主事务的状态。通过多个示例代码,如触发器和过程,详细解释了其功能和限制。
529

被折叠的 条评论
为什么被折叠?



