在PL/SQL觸發器中使用Select語句的語法是什麼?



oracle plsql (2)

這是我現在有:

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關鍵字找不到預期的地方


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)。


你正在玩觸發器中的熔岩(不僅僅是火焰)。 觸發器中的DBMS_OUTPUT真的很糟糕。 你可以在你的觸發器溢出緩衝區溢出,整個交易被拍攝。 祝你好運跟踪下來。 如果您必須執行輸出到控制台的行為,請調用寫入表的AUTONOMOUS TRANSACTION過程。

觸發器非常邪惡。 我曾經喜歡他們,但他們太難記了。 它們經常影響數據導致MUTATING數據(可怕,而不僅僅是因為萬聖節靠近)。

我們使用觸發器來更改列的值,如.new:LAST_MODIFIED:= sysdate和.new:LAST_MODIFIED_BY:= user。 而已。

千萬不要讓TRIGGER阻止交易完成。 找到另一個選項。





ora-00923