1

tableA と tableB の 2 つのテーブルがあります。トリガーを設定したい。tableA で挿入が発生すると、tableB でいくつかのイベントがトリガーされる場合があります。

2 つのテーブルは、たとえば次のようになります。

  • tableA 列: (product_id、product_name、manufacture)
  • tableB 列: (buyer, product_id)

私がやりたいことは、新しい行をテーブル A に挿入した後、その product_name が null の場合、tableB で更新をトリガーすることです。tableB の行の製造元が新しく挿入された製造元と同じである場合は、tableB の product_id をこの新しく挿入された product_id に更新します。

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 に答える 4

4

これらすべてのエラーが同時に発生していますか、それともさまざまなことを試しているときにさまざまなエラーが発生していますか? :NEW.product_idを省略した場合、ORA-00904 (および関連する ORA-00933) が表示され
ます: NEW.product_id

現在投稿されているように、問題ないように見えます-Errors: check compiler logその後もメッセージが表示されTRIGGER T1 compiledますか-それとも、SQL Developerのコンパイラログウィンドウで古いエラーを見ていますか? よくわからない場合は、再実行する前にコンパイラ ログ ウィンドウを右クリックして [クリア] を選択し、現在のコードで実際に生成されているエラー (存在する場合) を確認してください。

于 2011-04-18T08:40:38.880 に答える
4

大文字と小文字が混在する名前「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;
于 2011-04-18T08:47:15.320 に答える
0

CREATE TRIGGERSQL * Plusでは、ステートメントを1行で終了する必要があります/

SQLツールによっては、別の区切り文字を設定する別の方法を使用する必要がある場合があります。

于 2011-04-18T08:34:12.993 に答える
0

ネストされた select ステートメントの where 句を WHERE "tableA".manufacture = :NEW.manufacture から WHERE "tableA".manufacture = NEW.manufacture に変更します。

于 2012-04-16T12:36:27.887 に答える