在SQL DEVELOPER中的触发器中调用存储过程

时间:2018-10-03 20:43:47

标签: oracle stored-procedures triggers oracle-sqldeveloper

我正在尝试调用以下存储过程...

CREATE OR REPLACE PROCEDURE PRC_EXAMEN_SUELDO(fecha_hoy varchar2)
AS 
BEGIN
    IF fecha_hoy= 'WEDNESDAY' then
        RAISE_APPLICATION_ERROR(-20777, 'Los ' || fecha_hoy ||' no se puede cambiar el sueldo');
    END IF;
END;

...在此触发器内:

CREATE OR REPLACE TRIGGER TRG_EXAMEN_SUELDO
BEFORE UPDATE OF SALARY ON EMPLOYEES
FOR EACH ROW   
DECLARE 
    HOY VARCHAR(50);
BEGIN 
    HOY:= TO_CHAR (SYSDATE, 'DAY');
    execute PRC_EXAMEN_SUELDO (HOY);
END;

但是会引发以下错误:

  

LINE / COL ERROR
  --------- ----------------------------------------- --------------------
  5/13 PLS-00103:预期以下情况之一时遇到符号“ PRC_EXAMEN_SUELDO”:
  :=。 (@%;立即
  要继续使用符号“:=”代替“ PRC_EXAMEN_SUELDO”。
  错误:检查编译器日志

我正在使用Oracle的HR​​模式。

该过程的目的是检查发送的日期是否等于sysdate的日期。如果是,它将激活错误。

据说,在编译以下代码后:

    set serveroutput on;
    update employees set salary = salary + 100 where employee_id = 100;

触发器应根据sysdate检查是否可以完成更改。否则,它将引发指定的错误。

存储过程正常工作,但触发器不起作用。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

EXECUTE是一个SQL * Plus命令(Docs),用于临时执行存储过程

set serveroutput on
exec hello -- hello is a procedure that simply dbms_output 'hello' back

我在SQL Developer中以脚本或在交互式外壳程序(例如SQL * Plus或SQLcl)中运行它,

hello

PL/SQL procedure successfully completed.

但是这些客户端具有一个命令解释器,用于处理“ exec”,这是EXECUTE的缩写。它不是PL / SQL语言的一部分。

在触发器主体中,您只需执行以下操作:

CREATE OR REPLACE TRIGGER TRG_EXAMEN_SUELDO
    BEFORE UPDATE OF SALARY ON EMPLOYEES
    FOR EACH ROW   
    DECLARE 
    HOY VARCHAR(50);
    BEGIN 
    HOY:= TO_CHAR (SYSDATE, 'DAY');
    PRC_EXAMEN_SUELDO (HOY);
    END;