10

これは私が現在持っているものです:

CREATE OR REPLACE TRIGGER MYTRIGGER
AFTER INSERT ON SOMETABLE
FOR EACH ROW    

DECLARE
 v_emplid varchar2(10);    

BEGIN
 SELECT
  personnum into v_emplid
 FROM PERSON
 WHERE PERSONID = :new.EMPLOYEEID;

dbms_output.put(v_emplid);

/* INSERT INTO SOMEOTHERTABLE USING v_emplid and some of the other values from the trigger table*/

END MYTRIGGER;    

DBA_ERRORSに次のエラーがあります:PL / SQL:ORA-00923:FROMキーワードが予期された場所に見つかりません

4

3 に答える 3

9

1)あなたの例には何か他のものがあるに違いありません。それは確かに私にとってはうまくいくようです

SQL> create table someTable( employeeid number );

Table created.

SQL> create table person( personid number, personnum varchar2(10) );

Table created.

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE TRIGGER MYTRIGGER
  2    AFTER INSERT ON SOMETABLE
  3    FOR EACH ROW
  4  DECLARE
  5   v_emplid varchar2(10);
  6  BEGIN
  7   SELECT personnum
  8     into v_emplid
  9     FROM PERSON
 10    WHERE PERSONID = :new.EMPLOYEEID;
 11    dbms_output.put(v_emplid);
 12    /* INSERT INTO SOMEOTHERTABLE USING v_emplid and some of the other values
 from the trigger table*/
 13* END MYTRIGGER;
 14  /

Trigger created.

SQL> insert into person values( 1, '123' );

1 row created.

SQL> insert into sometable values( 1 );

1 row created.

2) V_EMPLID を Person.PersonNum%TYPE 型として宣言して、データ型が正しいことを確認し、テーブルのデータ型が変更された場合にコードを変更する必要がないようにすることをお勧めします。

3)トリガーが定義されているテーブルをクエリまたは更新できないことを知っていると思います(したがって、someTableへのクエリまたは挿入はありません)。

于 2008-10-14T20:19:07.867 に答える
1

トリガーで溶岩(火だけでなく)で遊んでいます。トリガーの DBMS_OUTPUT は本当に、本当に悪いです。トリガーでバッファ オーバーフローが発生すると、トランザクション全体が実行されます。それを追跡して頑張ってください。コンソールへの出力のような動作を行う必要がある場合は、テーブルに書き込む AUTONOMOUS TRANSACTION プロシージャを呼び出します。

トリガーはかなり悪いです。私はそれらが好きでしたが、覚えるのが難しすぎます。それらはデータに影響を与えることが多く、データの変異につながります (ハロウィンが近いという理由だけでなく恐ろしいことです)。

トリガーを使用して、.new:LAST_MODIFIED := sysdate や .new:LAST_MODIFIED_BY := user などの列の値を変更します。それでおしまい。

TRIGGER がトランザクションの完了を妨げないようにしてください。別のオプションを見つけます。

于 2008-10-14T20:34:59.503 に答える
-3

トリガーでselectステートメントを使用することはありません。select into ではなく、テーブルに挿入します。テーブルがすでに存在すると、select into はほとんどのデータベースで機能しません。

于 2008-10-14T20:15:15.813 に答える