2008-10-14 23 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阻止交易完成。找到另一个选项。