0

Oracle データベースの ID に対してauto_increment トリガーを作成しようとしています。いくつかの調査の後、シーケンスbefore insert トリガー
を使用して記述する方法を見つけました。

問題は、トリガーを実行すると、次のエラーが発生することです。

解析に失敗しました:

CREATE OR REPLACE TRIGGER AUTO_INC_PDE_ITINERAIRE
BEFORE INSERT
ON PDE_ITINERAIRE
FOR EACH ROW
BEGIN
SELECT PDE_ITINERAIRE_ID_SEQUENCE.NEXTVAL
INTO


次のコマンドを使用する場合:

select * from SYS.USER_ERRORS where name = 'AUTO_INC_PDE_ITINERAIRE';

次の出力が返されます。

3行目 | 位置 10 | PLS-00201: 識別子'NEW.PDE_ITINERAIRE'は
2行目で宣言する必要があります | ポジション03 | PL/SQL: SQL ステートメントは無視されました
4 行目 | ポジション03 | PL/SQL: ORA-00904 識別子が無効です


トリガーの完全なクエリは次のとおりです。

CREATE OR REPLACE TRIGGER AUTO_INC_PDE_ITINERAIRE
BEFORE INSERT 
ON PDE_ITINERAIRE
FOR EACH ROW
BEGIN
SELECT PDE_ITINERAIRE_ID_SEQUENCE.NEXTVAL
INTO   :NEW.PDE_ITINERAIRE.ID_PDE_ITINERAIRE
FROM   dual;
END;
/

私はオラクルのトリガーにあまり慣れていないので、誰かが私のトリガーの何が問題なのかを見つけるのを手伝ってくれませんか?

御時間ありがとうございます


編集

あなたのアドバイスからトリガーを変更しました

CREATE OR REPLACE TRIGGER AUTO_INC_PDE_ITINERAIRE
BEFORE INSERT 
ON PDE_ITINERAIRE
FOR EACH ROW
BEGIN
    :NEW.ID_PDE_ITINERAIRE := PDE_ITINERAIRE_ID_SEQUENCE.NEXTVAL;
END;
/


私はまだ同じエラー出力を持っています。

詳細情報 :
--Oracle は v11 です。
--IDEはTOra3を使用。

編集2

尋ねられたDDLは次のとおりです。

CREATE TABLE "GEOMAP"."PDE_ITINERAIRE"
( "ID_PDE_ITINERAIRE" NUMBER(11,0) NOT NULL ENABLE,
"NOM_ITINERAIRE" VARCHAR2(255) NOT NULL ENABLE,
"LONGUEUR" NUMBER(15,4),
"INSEE_DEPART" VARCHAR2(5 )、
"INSEE_ARRIVEE" VARCHAR2(5)、
"TYPE_ITINERAIRE" VARCHAR2(30)、
"TYPE_BALISAGE" VARCHAR2(30)、
"COULEUR_BALISAGE" VARCHAR2(55)、
"NOM_TOPO_GUIDE" VARCHAR2(255)、
"ANNEE_TOPO_GUIDE" VARCHAR2(4)、
"DATE_DERNIER_ENTRETIEN" DATE、
"PERIODICITE_PREVUE" VARCHAR2(30)、
"DATE_PROCHAIN_ENTRETIEN" DATE,
"ORGANISME_ENTRETIEN" VARCHAR2(60),
"OBSERVATIONS_ENTRETIEN" VARCHAR2(30),
"CREATEUR" VARCHAR2(55),
"COUT_TOTAL" VARCHAR2(50),
"DATE_DECISION_CP" DATE,
"SUBVENTION_ITINERAIRE" NUMBER(8,2),
"SUBVENTION_TOPO" NUMBER(8,2),
" OBSERVATIONS_ADMIN" VARCHAR2(255),
"HEBERGEMENT" VARCHAR2(30),
"MONUMENTS" VARCHAR2(30),
"OBSERVATIONS_TOURISTIQUES" VARCHAR2(30),
"GEOMETRIE" "MDSYS"."SDO_GEOMETRY" ,
"COMMUNE_DEPART" VARCHAR2(55),
「COMMUNE_ARRIVEE」VARCHAR2(55)、
「FICHIER_TOPO_GUIDE」VARCHAR2(255)
)

4

2 に答える 2

2

:newトリガーのテーブルのすべての列を含むレコードであるため、参照するときにテーブル名を含めることはできません。

:NEW.PDE_ITINERAIRE.ID_PDE_ITINERAIREする必要があります:NEW.ID_PDE_ITINERAIRE

さらに、必要はありません。select単に値を割り当てることができます (少なくともサポートされているバージョンの Oracle では)。

CREATE OR REPLACE TRIGGER AUTO_INC_PDE_ITINERAIRE
BEFORE INSERT 
ON PDE_ITINERAIRE
FOR EACH ROW
BEGIN
   :NEW.ID_PDE_ITINERAIRE := PDE_ITINERAIRE_ID_SEQUENCE.NEXTVAL;
END;
/
于 2016-06-17T13:50:22.473 に答える