ошибка запуска оракула - PullRequest
       24

ошибка запуска оракула

1 голос
/ 18 апреля 2011

У меня есть две таблицы, таблица A и таблица B. Я хочу установить триггер. Как только вставка происходит в таблице A, она может вызвать некоторые события в таблице B.

Ниже приведены две таблицы, например,

  • Таблица A столбцы: (идентификатор продукта, имя продукта, производство)
  • столбцы таблицы B: (покупатель, product_id)

Что я хочу сделать: после вставки новой строки в таблицу A, если ее product_name имеет значение null, то инициировать обновления для tableB. Обновите tableB 'product_id на этот новый вставленный product_id, если строки в tableB имеют то же производство, что и новое вставленное производство.

CREATE TRIGGER t1     

AFTER INSERT ON tableA    
FOR EACH ROW WHEN (NEW.product_name is NULL)

BEGIN

    UPDATE tableB 
       SET tableB.product_id = :NEW.product_id 
     WHERE tableB.product_id IN (SELECT tableA.product_id 
                                   FROM tableA 
                                  WHERE tableA.manufacture = :NEW.manufacture);

END;

Всегда жалуется на несколько ошибок в SQL-разработчике:

Error(2,2): PL/SQL: SQL Statement ignored
Error(2,120): PL/SQL: ORA-00933: SQL command not properly ended
Error(2,36): PL/SQL: ORA-00904: "NEW"."product_id": invalid identifier
Error: PLS-00801: internal error [ph2csql_strdef_to_diana:bind]

Обновление:

CREATE TABLE "tableA"
  (
    "PRODUCT_ID"      NUMBER PRIMARY KEY,
    "PRODUCT_NAME"    VARCHAR2(50 BYTE) DEFAULT NULL,
    "MANUFACTURE" VARCHAR2(50 BYTE) DEFAULT NULL
)

CREATE TABLE "tableB"
(
    "BUYER_ID"      NUMBER PRIMARY KEY,
    "PRODUCT_ID"    NUMBER DEFAULT NULL
)

Ответы [ 4 ]

4 голосов
/ 18 апреля 2011

Получаете ли вы все эти ошибки одновременно или разные ошибки, когда вы пробуете разные вещи? ORA-00904 (и, возможно, связанный с ним ORA-00933) появится, если вы опустите : перед NEW.product_id, а PLS-00801 может иметь пробел между
(т. Е. : NEW.product_id. Не уверен как вы могли бы получить оба одновременно.

Как он размещен сейчас, он выглядит нормально - вы все еще получаете сообщение Errors: check compiler log после TRIGGER T1 compiled - или вы смотрите на старые ошибки в окне журнала компилятора SQL Developer? Если вы не уверены, щелкните правой кнопкой мыши в окне журнала компилятора и выберите «очистить» перед повторным запуском, чтобы увидеть, какие ошибки (если таковые имеются) действительно генерируются текущим кодом.

4 голосов
/ 18 апреля 2011

Вы создали таблицы со смешанными именами "tableA" и "tableB".Обычно это плохая практика в Oracle и приводит к проблемам при ссылках на таблицы в коде, потому что на них необходимо следует ссылаться в правильном регистре, заключенном в двойные кавычки:

CREATE TRIGGER t1     

AFTER INSERT ON "tableA"    
FOR EACH ROW WHEN (NEW.product_name is NULL)

BEGIN

    UPDATE "tableB" 
       SET "tableB".product_id = :NEW.product_id 
     WHERE "tableB".product_id IN (SELECT "tableA".product_id 
                                   FROM "tableA" 
                                  WHERE "tableA".manufacture = :NEW.manufacture);

END;
0 голосов
/ 16 апреля 2012

Измените предложение where в вашем вложенном операторе select из ГДЕ "tableA" .manufacture =: NEW.manufacture в ГДЕ "tableA". Производство = NEW. Производство

0 голосов
/ 18 апреля 2011

В SQL * Plus необходимо завершить оператор CREATE TRIGGER символом / в одной строке.

В зависимости от вашего инструмента SQL вам может понадобиться использовать другой способ установки альтернативного разделителя.

...