Проблема не в самой процедуре, а в ее интерфейсе. Параметры out
и in out
записывают свои значения обратно в качестве вывода. Например:
create table demo (id integer);
Процедура (создает без ошибок):
create or replace procedure insert_demo
( id in out demo.id%type )
as
begin
insert into demo (id) values (id);
end insert_demo;
Вызов не удался, потому что буквенное значение 1
не может быть обновлено значением out
, возвращаемым процедурой:
SQL> exec insert_demo(1)
BEGIN insert_demo(1); END;
*
ERROR at line 1:
ORA-06550: line 1, column 19:
PLS-00363: expression '1' cannot be used as an assignment target
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Если вы собираетесь использовать параметры out
или in out
, вам нужно передать переменные (пример SQL * Plus ниже, хотя вы можете просто вызвать его из другой процедуры, передавая обычную переменную PL / SQL):
SQL> var id number
SQL> exec :id := 1
PL/SQL procedure successfully completed.
ID
----------
1
SQL> exec insert_demo(:id)
PL/SQL procedure successfully completed.
ID
----------
1
Поэтому решение состоит в том, чтобы либо передавать переменные, либо изменять режим параметров на in
:
create or replace procedure insert_demo
( id in demo.id%type )
as
begin
insert into demo (id) values (id);
end insert_demo;
Тест:
SQL> exec insert_demo(1)
PL/SQL procedure successfully completed.
Обычно рекомендуется избегать использования имен столбцов для параметров и переменных PL / SQL, например путем добавления префикса к параметру p_
и локальных переменных к l_
. Или, если необходимо, вы можете использовать точечную нотацию и название процедуры, например, insert_demo.id
или instert_update_empleado.salario
будет указывать параметр процедуры, а не столбец таблицы. Однако это не является причиной проблемы здесь.
(Кроме того, ваш caps lock включен.)