Oracle错误:表达式“不能用作分配目标

时间:2019-06-14 19:44:04

标签: oracle oracle-sqldeveloper

当我尝试执行存储过程时,传递给它的所有参数都显示为“表达式'(parameter)'不能用作分配目标”,我不知道问题出在哪里。

这是存储过程:

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 个答案:

答案 0 :(得分:2)

由于要插入或更新表,因此需要首先创建表。

如果您已经有了表格,请忽略此步骤:

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;

答案 1 :(得分:0)

问题不在于过程本身,而在于其接口。 <div class="somediv">existing</div>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参数,则必须传递变量(下面的SQL * Plus示例,尽管您可以从另一个传递普通PL / SQL变量的过程调用它):

in out

因此,解决方案是传递变量,或将参数模式更改为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;

通常最好避免使用列名作为PL / SQL参数和变量,例如,在参数前面加上SQL> exec insert_demo(1) PL/SQL procedure successfully completed. ,在局部变量前面加上p_。或者,如果需要,则可以使用点符号和过程名称,例如l_insert_demo.id将指定过程参数,而不是表列。但是,这不是这里问题的原因。

(此外,您的大写锁定处于打开状态。)