PLSQL: ORA-14551: невозможно выполнить операцию DML внутри запроса - PullRequest
0 голосов
/ 12 марта 2019

Я просмотрел некоторые из уже отвеченных вопросов, упомянутых ниже, но не смог найти решение, которое помогло бы мне.

ORA-14551: невозможно выполнить операцию DML внутри запроса

ORA-14551: невозможно выполнить операцию DML внутри ошибки запроса при использовании немедленного выполнения

Я написал это в функции, которую я вызываю из процедуры.

OPEN c_rules_details;
            LOOP
                FETCH c_rules_details INTO rule_conditions_record;
                EXIT WHEN c_rules_details %notfound;                
                dbms_output.put_line('Range and rule is  '|| rule_conditions_record.rdr_tmplt_id || rule_conditions_record.rdr_rng_from ||rule_conditions_record.rdr_rng_to); 
                SELECT COUNT(*) INTO v_balance_records FROM t_scb_temp_objects WHERE RULE_CONDITION=rule_conditions_record.rdr_tmplt_id AND CHARGE is NULL;
                dbms_output.put_line('Number of records in rule are  '|| v_balance_records); 
                IF v_balance_records>rule_conditions_record.rdr_rng_from AND v_balance_records<rule_conditions_record.rdr_rng_to THEN
                    v_ssql_stmnt:='UPDATE t_scb_temp_objects
                    SET CHARGE='||rule_conditions_record.rfr_chrg_amt||' WHERE RULE_CONDITION='||rule_conditions_record.rdr_tmplt_id;

                    EXECUTE IMMEDIATE v_ssql_stmnt;
                END IF;
            END LOOP;
        CLOSE   c_rules_details;

1 Ответ

1 голос
/ 12 марта 2019

Это то, что вам сказали - вы не можете выполнять 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>

Еще раз: вы, вероятно, не хотите этого делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...