2008-10-14 54 views
7

這是我目前有:在PL/SQL觸發器中使用Select語句的語法是什麼?

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關鍵字未找到預期

+0

該錯誤報告的內容是什麼? – 2008-10-14 20:43:49

+0

序列中的第一個錯誤位於'WHERE PERSONID ...'行。 – Equistatic 2008-10-14 21:02:24

+0

更新了我的回覆,您的示例還有其他內容尚未發佈。所寫的代碼適用於我。 – 2008-10-14 21:14:17

回答

6

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的工作,這樣就可以了確保數據類型正確,並且如果表的數據類型發生更改,則不需要更改代碼。我假設你知道你的觸發器不能查詢或更新定義了觸發器的表(所以沒有查詢或插入someTable)。

-2

我不會在觸發器使用select statment永遠。插入表格而不是選擇進入。一旦表格已經存在,select into在大多數數據庫中不起作用。

1

你在玩觸發器中的熔岩(不僅僅是火焰)。觸發器中的DBMS_OUTPUT確實非常糟糕。您可以在觸發器中發生緩衝區溢出並完成整個交易。祝你好運跟蹤下來。如果您必須執行輸出到控制檯的行爲,請調用寫入表的AUTONOMOUS TRANSACTION過程。

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

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

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