Это то, что вам сказали - вы не можете выполнять DML (в вашем случае UPDATE t_scb_temp_objects ...
) внутри функции, которую вы (каким-то образом - вы не показали как ) вызывали из процедура. Это может быть - например:
create or replace function f_test (par_deptno in number)
return number
is
...
begin
open c_rules_details;
loop
-- your current code goes here
execute immediate v_sql_stmnt;
end loop;
return 1;
end;
create or replace procedure p_test is
l_ename emp.ename%type;
begin
select e.ename
into l_ename
from emp e
where e.deptno = f_test(e.deptno); --> this will cause the error
end;
Итак, что делать? Выполните UPDATE
изнутри процедуры, а не функции.
Если должна быть функцией, сделать ее автономной транзакцией (используя PRAGMA
), но я бы не рекомендовал это делать. Вы бы предпочли что-то другое. Вот как, однако:
SQL> create table test (col number);
Table created.
SQL> insert into test (col) values (100);
1 row created.
SQL> commit;
Commit complete.
Во-первых, функция, которая выйдет из строя (как и ваша):
SQL> create or replace function f_test return number is
2 begin
3 update test set col = 10;
4 commit;
5 return 1;
6 end;
7 /
Function created.
SQL> select f_test from dual;
select f_test from dual
*
ERROR at line 1:
ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "SCOTT.F_TEST", line 3
Теперь тот, который преуспеет:
SQL> create or replace function f_test return number is
2 pragma autonomous_transaction; --> this
3 begin
4 update test set col = 10;
5 commit;
6 return 1;
7 end;
8 /
Function created.
SQL> select f_test from dual;
F_TEST
----------
1
SQL> select * from test;
COL
----------
10
SQL>
Еще раз: вы, вероятно, не хотите этого делать.