Ошибка Oracle: выражение '' нельзя использовать в качестве цели назначения - PullRequest
0 голосов
/ 14 июня 2019

Когда я пытаюсь выполнить хранимую процедуру, все параметры, которые я ей передаю, появляются, что «выражение» (параметр) «не может быть использовано в качестве цели назначения», я не знаю, в чем проблема.

Это хранимая процедура:

create or replace PROCEDURE INSTERT_UPDATE_EMPLEADO 
(
  CEDULA IN OUT INTEGER,
  ID_CARGO IN OUT INTEGER,
  ID_EMP IN OUT INTEGER,
  NOMBRE IN OUT VARCHAR,
  APELLIDO IN OUT VARCHAR,
  FECHA_NAC IN OUT INTEGER,
  FECHA_CON IN OUT INTEGER,
  SALARIO IN OUT INTEGER
) AS 

BEGIN
  IF ID_EMP = 0 THEN
    INSERT INTO EMPLEADO("CEDULA_EMPLEADO", "ID_CARGO", "EMPLEADO_ID", "NOMBRE", "APELLIDO", "FECHA_NAC", "FECHA_CONTRATO", "SALARIO")
    VALUES (CEDULA, ID_CARGO, ID_EMP, NOMBRE, APELLIDO, FECHA_NAC, FECHA_CON, SALARIO);
  ELSE
    UPDATE EMPLEADO SET NOMBRE = NOMBRE, APELLIDO = APELLIDO, FECHA_NAC = FECHA_NAC, FECHA_CONTRATO = FECHA_CON, SALARIO = SALARIO,
           CEDULA_EMPLEADO = CEDULA, ID_CARGO = ID_CARGO WHERE EMPLEADO_ID = ID_EMP;
  END IF;

  COMMIT;

END INSTERT_UPDATE_EMPLEADO;

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

Поскольку вы собираетесь вставить или обновить таблицу, вам необходимо сначала создать таблицу.

Если у вас уже есть таблица, игнорируйте этот шаг:

create table EMPLEADO 
(
  CEDULA    NUMBER(5),
  ID_CARGO  NUMBER(5),
  ID_EMP    NUMBER(5),
  NOMBRE    VARCHAR2(20),
  APELLIDO  VARCHAR2(20),
  FECHA_NAC NUMBER(5),
  FECHA_CON NUMBER(5),
  SALARIO   NUMBER(5)
) 

Затемсоздать хранимую процедуру:

CREATE OR REPLACE PROCEDURE INSTERT_UPDATE_EMPLEADO(
  P_CEDULA IN EMPLEADO.CEDULA%TYPE,
  P_ID_CARGO IN EMPLEADO.ID_CARGO%TYPE,
  P_ID_EMP IN EMPLEADO.ID_EMP%TYPE,
  P_NOMBRE IN EMPLEADO.NOMBRE%TYPE,
  P_APELLIDO IN EMPLEADO.APELLIDO%TYPE,
  P_FECHA_NAC IN EMPLEADO.APELLIDO%TYPE,
  P_FECHA_CON IN EMPLEADO.FECHA_CON%TYPE,
  P_SALARIO IN EMPLEADO.SALARIO%TYPE)
IS 
BEGIN
   IF P_ID_EMP = 0 THEN
     INSERT INTO EMPLEADO("CEDULA_EMPLEADO", "ID_CARGO", "EMPLEADO_ID", "NOMBRE", "APELLIDO", "FECHA_NAC", "FECHA_CONTRATO", "SALARIO")
     VALUES (P_CEDULA, P_ID_CARGO, P_ID_EMP, P_NOMBRE, P_APELLIDO, P_FECHA_NAC, P_FECHA_CON, P_SALARIO);
   ELSE
     UPDATE EMPLEADO 
     SET NOMBRE = P_NOMBRE, 
         APELLIDO = P_APELLIDO, 
         FECHA_NAC = P_FECHA_NAC, 
         FECHA_CONTRATO = P_FECHA_CON, 
         SALARIO = P_SALARIO,
         CEDULA_EMPLEADO = P_CEDULA, 
         ID_CARGO = P_ID_CARGO 
         WHERE EMPLEADO_ID = P_ID_EMP;
  END IF;

  COMMIT;
END;
0 голосов
/ 15 июня 2019

Проблема не в самой процедуре, а в ее интерфейсе. Параметры 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 включен.)

...