Oracle PL/SQL/Stored Procedure Function/Autonomous transaction

Материал из SQL эксперт
Перейти к: навигация, поиск

Mark function with "pragma autonomous_transaction"

   
SQL> create table emp (
  2   empno number(10),
  3   viewed date );
Table created.
SQL>
SQL> create or replace function AUDIT_ROW(id number) return number is
  2   begin
  3       insert into emp values (id, sysdate);
  4       return 0;
  5   end;
  6  /
Function created.
SQL> show errors
No errors.
SQL>
SQL> create or replace function AUDIT_ROW(id number) return number is
  2   pragma autonomous_transaction;
  3   begin
  4       insert into emp values (id, sysdate);
  5       commit;
  6       return 0;
  7   end;
  8  /
Function created.
SQL> show errors
No errors.
SQL>
SQL> drop table emp;
Table dropped.



pragma autonomous_transaction and exception

   
SQL> create table myTable (
  2   tname varchar2(30),
  3   cname varchar2(30),
  4   changed date);
Table created.
SQL>
SQL> create or replace procedure RUN_DDL(m varchar2) is
  2   pragma autonomous_transaction;
  3   begin
  4   execute immediate m;
  5   end;
  6  /
Procedure created.
SQL>
SQL> create or replace procedure ADD_COLUMN(p_table varchar2, p_column varchar2) is
  2   v number;
  3   begin
  4       insert into myTable values (p_table, p_column, sysdate);
  5       run_ddl("alter table "||p_table||" add "||p_column);
  6       v := 1/0;
  7   end;
  8  /
Procedure created.
SQL> show errors
No errors.
SQL>
SQL> drop table myTable;
Table dropped.



pragma autonomous_transaction and raise exception

   
SQL>
SQL>
SQL> CREATE TABLE EMP(
  2      EMPNO NUMBER(4) NOT NULL,
  3      ENAME VARCHAR2(10),
  4      JOB VARCHAR2(9),
  5      MGR NUMBER(4),
  6      HIREDATE DATE,
  7      SAL NUMBER(7, 2),
  8      COMM NUMBER(7, 2),
  9      DEPTNO NUMBER(2)
 10  );
Table created.
SQL>
SQL> INSERT INTO EMP VALUES(7369, "SMITH", "CLERK", 7902,TO_DATE("17-DEC-1980", "DD-MON-YYYY"), 800, NULL, 20);
1 row created.
SQL> INSERT INTO EMP VALUES(7499, "ALLEN", "SALESMAN", 7698,TO_DATE("20-FEB-1981", "DD-MON-YYYY"), 1600, 300, 30);
1 row created.
SQL> INSERT INTO EMP VALUES(7521, "WARD", "SALESMAN", 7698,TO_DATE("22-FEB-1981", "DD-MON-YYYY"), 1250, 500, 30);
1 row created.
SQL> INSERT INTO EMP VALUES(7566, "JONES", "MANAGER", 7839,TO_DATE("2-APR-1981", "DD-MON-YYYY"), 2975, NULL, 20);
1 row created.
SQL> INSERT INTO EMP VALUES(7654, "MARTIN", "SALESMAN", 7698,TO_DATE("28-SEP-1981", "DD-MON-YYYY"), 1250, 1400, 30);
1 row created.
SQL> INSERT INTO EMP VALUES(7698, "BLAKE", "MANAGER", 7839,TO_DATE("1-MAY-1981", "DD-MON-YYYY"), 2850, NULL, 30);
1 row created.
SQL> INSERT INTO EMP VALUES(7782, "CLARK", "MANAGER", 7839,TO_DATE("9-JUN-1981", "DD-MON-YYYY"), 2450, NULL, 10);
1 row created.
SQL> INSERT INTO EMP VALUES(7788, "SCOTT", "ANALYST", 7566,TO_DATE("09-DEC-1982", "DD-MON-YYYY"), 3000, NULL, 20);
1 row created.
SQL> INSERT INTO EMP VALUES(7839, "KING", "PRESIDENT", NULL,TO_DATE("17-NOV-1981", "DD-MON-YYYY"), 5000, NULL, 10);
1 row created.
SQL> INSERT INTO EMP VALUES(7844, "TURNER", "SALESMAN", 7698,TO_DATE("8-SEP-1981", "DD-MON-YYYY"), 1500, 0, 30);
1 row created.
SQL> INSERT INTO EMP VALUES(7876, "ADAMS", "CLERK", 7788,TO_DATE("12-JAN-1983", "DD-MON-YYYY"), 1100, NULL, 20);
1 row created.
SQL> INSERT INTO EMP VALUES(7900, "JAMES", "CLERK", 7698,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 950, NULL, 30);
1 row created.
SQL> INSERT INTO EMP VALUES(7902, "FORD", "ANALYST", 7566,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 3000, NULL, 20);
1 row created.
SQL> INSERT INTO EMP VALUES(7934, "MILLER", "CLERK", 7782,TO_DATE("23-JAN-1982", "DD-MON-YYYY"), 1300, NULL, 10);
1 row created.
SQL>
SQL> create or replace procedure sal_check( p_deptno in number)is
  2          pragma autonomous_transaction;
  3          avg_sal number;
  4          max_sal number;
  5  begin
  6          select avg(sal), max(sal)
  7            into avg_sal, max_sal
  8            from emp
  9          where deptno = p_deptno;
 10          if ( max_sal/2 > avg_sal )
 11          then
 12              raise_application_error(-20001,"Rule violated");
 13          end if;
 14  end;
 15  /
Procedure created.
SQL>
SQL> update emp set sal = sal*1.1;
14 rows updated.
SQL>
SQL> update emp set sal = 99999.99 where ename = "WARD";
1 row updated.
SQL>
SQL> exec sal_check(30);
PL/SQL procedure successfully completed.
SQL>
SQL> drop table emp;
Table dropped.



pragma autonomous_transaction and rollback

   
SQL>
SQL> create table t ( msg varchar2(25) );
Table created.
SQL> create or replace procedure Autonomous_Insert
  2  as
  3          pragma autonomous_transaction;
  4  begin
  5          insert into t values ( "Autonomous Insert" );
  6          commit;
  7  end;
  8  /
Procedure created.
SQL> create or replace procedure NonAutonomous_Insert
  2  as
  3  begin
  4          insert into t values ( "NonAutonomous Insert" );
  5          commit;
  6  end;
  7  /
Procedure created.
SQL> begin
  2          insert into t values ( "Anonymous Block" );
  3          NonAutonomous_Insert;
  4          rollback;
  5  end;
  6  /
PL/SQL procedure successfully completed.
SQL> select * from t;
MSG
-------------------------
Anonymous Block
NonAutonomous Insert
SQL> delete from t;
2 rows deleted.
SQL> commit;
Commit complete.
SQL> begin
  2          insert into t values ( "Anonymous Block" );
  3          Autonomous_Insert;
  4          rollback;
  5  end;
  6  /
PL/SQL procedure successfully completed.
SQL> select * from t;
MSG
-------------------------
Autonomous Insert
SQL>
SQL> drop table t;
Table dropped.
SQL>