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

Приведенный ниже сценарий SQL pl переводит сумму c денег со счета a на b. Почему нельзя обновлять таблицу в функции / как это исправить?

 create or replace function ueberweisung (a varchar2, b varchar2,c number)   

 RETURN varchar2 IS   
 k1 number; -- Variablendeklaration   
 k2 number;  

 BEGIN   

 SELECT saldo into k1   
 FROM konto   
 WHERE konto_nr=a;   

 SELECT saldo into k2   
 FROM konto   
 WHERE konto_nr=b;   

 k1:=k1-c;  
 k2:=k2+c;  

 update konto 
 set saldo = case
when konto_nr=a then k1
when konto_nr=b then k2
end;
commit;

 RETURN (c ||'Eur überwiesen von Konto ' || a || 'a uf Konto ' || b);   
 END ueberweisung;

person Community    schedule 23.06.2019    source источник
comment
Функция предназначена только для возврата данных, а не для их изменения. По сути, это просто читатель, а не писатель. Почему вы не используете хранимую процедуру?   -  person HoneyBadger    schedule 23.06.2019
comment
Допускается обновление таблицы из функции. (При изменении данных принято использовать процедуру, а не функцию, но это разрешено). Что не разрешено, так это вызывать эту функцию из SQL. Вы по-прежнему можете вызывать его (или процедуру) из PL / SQL, но не из контекста SQL. Вы не показали, как вы его вызываете, но ошибка означает, что вы сделали его частью SQL-запроса.   -  person Alex Poole    schedule 23.06.2019


Ответы (1)


Это часть Ограничений на функции PL / SQL

Чтобы защититься от неприятных побочных эффектов и предсказуемого поведения, сервер Oracle не позволяет вашей сохраненной функции в SQL выполнять любое из следующих действий: Сохраненная функция не может изменять таблицы базы данных.

  • Невозможно выполнить инструкции INSERT, DELETE или UPDATE.

Вместо этого используйте процедуру PL / SQL

PL / SQL имеет два типа подпрограмм, процедур и функций. Как правило, вы используете процедуру для выполнения действия и функцию для вычисления значения.

person user7294900    schedule 23.06.2019