2017-02-12 15 views
-2

挿入トリガーの前にシーケンスを実行しようとすると問題が発生します。あなたがターゲット表の列ではありません:NEWで何かを参照しようとした場合Oracle 11gを使用したSQL Developerのバインド変数

CREATE TABLE personne (ID number, nom varchar2(250 char)); 

CREATE SEQUENCE s_inc_pers START WITH 1 INCREMENT BY 1; 

CREATE TRIGGER tr_inc_pers ON t1 BEFORE INSERT 
FOR EACH ROW 
DECLARE 
BEGIN 
    select s_inc_pers into :new.t1.ID from DUAL; 
END. 
+2

は、人々がより速く、より良い答えあなたが経験しているエラーメッセージや動作など、あなたが期待していたものとはどう違うのですか? –

答えて

2

Oracleが悪いバインド変数を報告します。この場合、ステートメントの形式が誤っているため、バインド値の入力を求めることがあります。

The NEW pseudorecordは、ステートメントの影響を受けているトリガーテーブル内の行を指します。 pseudorecordフィールドを使用するときにテーブル名を含める必要はありません(または含める必要もありません)。:new.t1.IDはちょうど:new.IDである必要があります。

get the next value from the sequencenextvalを使用する必要がある場合は、シーケンス名を指定するだけではありません。

また、句の順序が間違っているため、DMLイベント(挿入)を実行する必要があります。

CREATE TRIGGER tr_inc_pers BEFORE INSERT ON t1 
FOR EACH ROW 
BEGIN 
    select s_inc_pers.nextval into :new.ID from DUAL; 
END; 

あなたはあなたもデュアルから選択する必要はありません11グラムを使用しているため、you can just assign the column value:あなたは、あなたが経験している問題の種類を含める場合、それは通常、支援している

CREATE TRIGGER tr_inc_pers BEFORE INSERT ON t1 
FOR EACH ROW 
BEGIN 
    :new.ID := s_inc_pers.nextval; 
END; 
+0

@mathguy - ありがとう。 D'oh。 –

関連する問題