В инструкции вставки внутри вашей функции отсутствует ключевое слово values
;
insert into EMPLOYEE('22',12000,'john');
должно быть
insert into EMPLOYEE values ('22',12000,'john');
хотя лучше включить список имен столбцов. Из небольшой части кода, которую вы показали, это единственное, что является недействительным. Могут быть другие ошибки в пропущенных вами битах. (Если первый столбец в вашей таблице числовой, тогда вам не следует передавать строку - она работает, но выполняет неявное преобразование и ее лучше избегать. А если столбец является строкой, должно ли это быть на самом деле?)
В UDF могут быть только операторы select, но не операторы вставки / обновления / удаления
Это не правильно. У вас может быть DML (вставка / обновление / удаление) в функции, но вы можете вызывать его только из контекста PL / SQL (хотя даже в PL / SQL часто говорят, что функции должны запрашивать данные без побочных эффектов и только процедур). следует изменить данные, но это не ограничено самим языком):
create table employee (id varchar2(3), salary number, name varchar2(10));
Table EMPLOYEE created.
create function test(unused number)
return number as
BEGIN
insert into EMPLOYEE (id, salary, name)
values ('22',12000,'john');
return 0;
END;
/
Function TEST compiled
declare
rc number;
begin
rc := test(42);
end;
/
PL/SQL procedure successfully completed.
select * from employee;
ID SALARY NAME
--- ---------- ----------
22 12000 john
Но вы не можете вызвать его из контекста SQL:
select test(42) from dual;
ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "MYSCHEMA.TEST", line 4
В документации перечислены ограничения на функции, вызываемые из SQL , и более подробно рассматривается в этом предупреждении :
Поскольку SQL является декларативным языком, а не императивным (или процедурным), вы не можете знать, сколько раз будет выполняться функция, вызываемая оператором SQL, даже если функция написана на PL / SQL, императивном языке .
Если бы функции было разрешено выполнять DML, то вы бы не контролировали, сколько раз выполнялся DML. Например, если он выполняет вставку, он может попытаться вставить одну и ту же строку дважды и либо дублировать данные, либо получить нарушение ограничения.