Вызов хранимой процедуры в триггере в SQL DEVELOPER - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь вызвать следующую хранимую процедуру ...

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» для продолжения.
Ошибки: проверьте журнал компилятора

Я использую схему HR Oracle.

Цель процедуры состоит в том, чтобы проверить, равен ли отправленный день дню sysdate. Если это так, он активирует ошибку.

Предположительно, после компиляции этой строки кода:

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

Триггер должен проверить, может ли изменение быть выполнено в соответствии с sysdate. Иначе, он выдает указанную ошибку.

Хранимая процедура работает правильно, но триггер не 'т. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 04 октября 2018

EXECUTE - это команда SQL * Plus ( Docs ) для выполнения хранимых процедур, ad hoc

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;
...