SQL - Oracle 11g - PL / SQL - Ошибка компиляции триггера - PullRequest
0 голосов
/ 13 января 2012

У меня проблемы с запуском этого куска кода.Он говорит, что триггер был создан с ошибками компиляции, но не объясняет, что не так, и не дает никакого вывода.Ниже приведен код и ошибка, которую я получил.Я на Oracle 11g R1 и использую PL / SQL.

CREATE OR REPLACE TRIGGER checkRecommendedAge
BEFORE INSERT OR UPDATE ON Loan
FOR EACH ROW
DECLARE
    borAge number;
    ex     exception;

BEGIN
    SELECT count(*) INTO borAge
    FROM Loan
    WHERE dateOut =: new.dateOut;
    IF borAge < 18 THEN
        dbms.output.put_line('Row added to Book table succesful');
    ELSE
        raise ex;
    END IF;

    EXCEPTION
    WHEN EX THEN
    raise_application_error("Error");
END;
/

Ошибка:

    Warning: Trigger created with compilation errors.

SQL> SHOW ERRORS
Errors for TRIGGER CHECKRECOMMENDEDAGE:

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0      PLS-00801: internal error [ph2csql_strdef_to_diana:bind]
6/2      PL/SQL: SQL Statement ignored
7/7      PL/SQL: ORA-06544: PL/SQL: internal error, arguments:
         [ph2csql_strdef_to_diana:bind], [], [], [], [], [], [], []

10/3     PL/SQL: Statement ignored
10/3     PLS-00201: identifier 'DBMS.OUTPUT' must be declared
17/2     PL/SQL: Statement ignored
17/27    PLS-00201: identifier 'Error' must be declared

Любая помощь будет оценена

Спасибо

Ответы [ 4 ]

1 голос
/ 13 января 2012

Вы указываете dbms.output. Попробуйте dbms_output.put_line в вашем триггере.

EDIT:

Вы неправильно звоните в RAISE_APPLICATION_ERROR. Во-первых, не используйте здесь строку в двойных кавычках - это указывает на идентификатор, а не на строку. Во-вторых, синтаксис этой процедуры:

raise_application_error(error_number, message[, {TRUE | FALSE}]);

Более подробную информацию см. В документации .

Вы также можете столкнуться с ужасной ошибкой "ORA-04091: Таблица XXXXX мутирует", потому что вы выбираете из той же таблицы, для которой запускается триггер. См. эту статью AskTom для получения дополнительной информации.

0 голосов
/ 14 января 2012

Кроме того,

WHERE dateOut =: new.dateOut;

вероятно должно быть:

WHERE dateOut = new.dateOut;
0 голосов
/ 13 января 2012

Дайте это попробовать.Изменения:dbms.output до dbms_outputdateOut =: до dateOut =raise_application_error("Error"); до raise_application_error('Error');

CREATE OR REPLACE TRIGGER checkRecommendedAge
BEFORE INSERT OR UPDATE ON Loan
FOR EACH ROW
DECLARE
    borAge number;
    ex     exception;

BEGIN
    SELECT count(*) INTO borAge
    FROM Loan
    WHERE dateOut = new.dateOut;
    IF borAge < 18 THEN
        dbms_output.put_line('Row added to Book table succesful');
    ELSE
        raise ex;
    END IF;

    EXCEPTION
    WHEN EX THEN
    raise_application_error('Error');
END;
/
0 голосов
/ 13 января 2012

Где находится ВЫХОД, КОГДА bookCursor% NOTFOUND;?

Ops ;-) Попробуйте опубликовать полный триггер.Какой размер буфера DBMS?

...