测试结果,自治事务并且加了commit的函数可以在Sql和pl/sql中执行
SQL> create table dual1 as select * from dual;
表已创建。
SQL> create or replace function f1(a varchar)
2 return int
3 is
4 begin
5 update dual1 set dummy=a;
6 return 0;
7 end;
8 /
函数已创建。
SQL> select * from dual1;
DU
--
X
SQL> select f1('o')from dual;
select f1('o')from dual
*
第 1 行出现错误:
ORA-14551: 无法在查询中执行 DML 操作
ORA-06512: 在 "HR.F1", line 5
SQL> create or replace function f2(a varchar)
2 return int
3 is
4 begin
5 execute immediate 'update dual1 set dummy=:x'using a;
6 return 0;
7 end;
8 /
函数已创建。
SQL> select f2('o')from dual;
select f2('o')from dual
*
第 1 行出现错误:
ORA-14551: 无法在查询中执行 DML 操作
ORA-06512: 在 "HR.F2", line 5
SQL> create or replace function f3(a varchar)
2 return int
3 is
4 PRAGMA AUTONOMOUS_TRANSACTION ;
5 begin
6 execute immediate 'update dual1 set dummy=:x'using a;
7 return 0;
8 end;
9 /
函数已创建。
SQL> select f3('o')from dual;
select f3('o')from dual
*
第 1 行出现错误:
ORA-06519: 检测到活动的独立的事务处理, 已经回退
ORA-06512: 在 "HR.F3", line 8
SQL> select * from dual1;
DU
--
X
SQL> begin f1('o'); end;
2 /
begin f1('o'); end;
*
第 1 行出现错误:
ORA-06550: 第 1 行, 第 7 列:
PLS-00221: 'F1' 不是过程或尚未定义
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
SQL> declare x int;begin x:=f1('o'); end;
2 /
PL/SQL 过程已成功完成。
SQL> select * from dual1;
DU
--
o
SQL>
SQL> declare x int;begin x:=f2('j'); end;
2 /
PL/SQL 过程已成功完成。
SQL> select * from dual1;
DU
--
j
SQL> declare x int;begin x:=f3('3'); end;
2 /
declare x int;begin x:=f3('3'); end;
*
第 1 行出现错误:
ORA-00060: 等待资源时检测到死锁
ORA-06512: 在 "HR.F3", line 6
ORA-06512: 在 line 1
SQL> commit;
提交完成。
SQL> declare x int;begin x:=f3('3'); end;
2 /
declare x int;begin x:=f3('3'); end;
*
第 1 行出现错误:
ORA-06519: 检测到活动的独立的事务处理, 已经回退
ORA-06512: 在 "HR.F3", line 8
ORA-06512: 在 line 1
SQL> declare x int;begin x:=f3('3'); end;
2 /
declare x int;begin x:=f3('3'); end;
*
第 1 行出现错误:
ORA-06519: 检测到活动的独立的事务处理, 已经回退
ORA-06512: 在 "HR.F3", line 8
ORA-06512: 在 line 1
SQL> create or replace function f4(a varchar)
2 return int
3 is
4 PRAGMA AUTONOMOUS_TRANSACTION ;
5 begin
6 execute immediate 'update dual1 set dummy=:x'using a;
7 commit;
8 return 0;
9 end;
10 /
函数已创建。
SQL> declare x int;begin x:=f4('4'); end;
2 /
PL/SQL 过程已成功完成。
SQL> select * from dual1;
DU
--
4
SQL> select f4('8')from dual;
F4('8')
----------
0
SQL> select * from dual1;
DU
--
8