在PL / SQL触发器中使用Select语句的语法是什么?

时间:2008-10-14 20:12:05

标签: sql oracle plsql ora-00923

这就是我目前所拥有的:

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关键字

3 个答案:

答案 0 :(得分: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类型,以便您可以确定数据类型是正确的,这样如果表的数据类型发生更改,您将无需更改你的代码。

3)我假设您知道您的触发器无法查询或更新定义触发器的表(因此不会对someTable进行查询或插入)。

答案 1 :(得分:1)

你正在玩触发器中的熔岩(不仅仅是火)。触发器中的DBMS_OUTPUT非常非常糟糕。您可以在触发器中的缓冲区溢出时爆炸,并且整个事务都会被触发。祝你好运追踪下来。如果必须执行输出到控制台之类的行为,请调用写入表的AUTONOMOUS TRANSACTION过程。

触发器非常邪恶。我曾经喜欢它们,但它们太难以记住了。它们经常会导致数据导致数据影响(可怕而且不仅仅是因为万圣节很接近)。

我们使用触发器来更改列的值,例如.new:LAST_MODIFIED:= sysdate和.new:LAST_MODIFIED_BY:= user。就是这样。

不要让TRIGGER阻止交易完成。找另一种选择。

答案 2 :(得分:-2)

我不会在触发器中使用select语句。插入表而不是选择。一旦表已经存在,select into在大多数数据库中都不起作用。