1

私はオラクルが初めてで、このトリガーの何が問題なのかわかりません:

CREATE OR REPLACE TRIGGER  "propuesta_casas" 
BEFORE INSERT ON "PROPUESTA_TIENDA_BARRIO"
FOR EACH ROW
 WHEN (new."CASASCAL" IS NULL) 
 BEGIN
    SELECT PROPUESTA.CASAS
    INTO :new."CASASCAL"
    FROM PROPUESTA WHERE PROPUESTA.IDPROPUESTA=new.IDPROPUESTA ;
 END;
/

エラー:

PL/SQL: ORA-00904: "NEW"."IDPROPUESTA": 識別子が無効です

4

2 に答える 2

3

それも添付されたコメントも投稿されたコードの明らかな問題に対処していないように見えるため、受け入れられた回答が受け入れられた理由がわかりません。

トリガー本体では、挿入された行の値を:NEWコード ワードで参照します。投稿されたコードには、WHERE 句で列を参照するときにコロンがありません。これが必要なものです:

CREATE OR REPLACE TRIGGER  "propuesta_casas" 
BEFORE INSERT ON "PROPUESTA_TIENDA_BARRIO"
FOR EACH ROW
 WHEN (new."CASASCAL" IS NULL) 
 BEGIN
    SELECT PROPUESTA.CASAS
    INTO :new."CASASCAL"
    FROM PROPUESTA 
    WHERE PROPUESTA.IDPROPUESTA=:new.IDPROPUESTA ;
 END;
/

ちなみに、オブジェクトを作成するときは、二重引用符で小文字を使用することに注意してください。

デフォルトでは、すべての Oracle 名は大文字でデータ ディクショナリに格納されますが、SQL ステートメントでは大文字と小文字が区別されません。したがって、次の 2 つのステートメントは同じオブジェクトを参照します。

select * from emp
/
select * from EMP
/

ただし、大文字と小文字が混在する名前または小文字の名前でオブジェクトを作成し、それを二重引用符で囲むと、データ ディクショナリに保存されます。これは、オブジェクトを二重引用符で囲んで参照するときは常に、その正確なケースを使用する必要があることを意味します。したがって、すべて小文字のテーブルを作成すると...

create table "emp"  ...

...その後、このステートメントは失敗します:

select * from emp
/

それはする必要があります

select * from "emp"
/

もちろん、すでに EMP というテーブルがある場合、別のテーブルから選択しただけであれば、最初のステートメントは成功します。

トリガーの場合、通常は名前で参照しません。ただし、データ ディクショナリでトリガーを検索するときは常に大文字と小文字を区別する必要があります。

select status
from user_triggers
where trigger_name = 'propuesta_casas'
/
于 2010-08-07T06:36:05.147 に答える
2

あなたが説明したことから:

トリガーを再コンパイルして、何が起こるかを確認してください...

ベース オブジェクト (テーブルなど) が無効または変更され、トリガーが影響を受けるテーブルを参照する場合、トリガーは無効になります。

于 2010-08-07T02:52:45.227 に答える