【问题标题】:What is the syntax to use a Select statement inside a PL/SQL Trigger?在 PL/SQL 触发器中使用 Select 语句的语法是什么?
【发布时间】:2010-09-17 04:28:34
【问题描述】:

这是我目前拥有的:

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 关键字未在预期位置找到

【问题讨论】:

  • 在哪一行报告此错误?
  • 序列中的第一个错误在“WHERE PERSONID...”行。
  • 更新了我的回复,您的示例还有其他内容尚未发布。编写的代码对我有用。

标签: sql oracle plsql ora-00923


【解决方案1】:

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) 我在第一次编辑时忽略了“FOR EACH ROW”,这就是它的设置方式。谢谢。
  • 我以这种形式重写了它,它似乎有效。它可能与对齐方式、脚本中的制表符或 into 语句中的行分隔差异有关。谢谢。
【解决方案2】:

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

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

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

永远不要让 TRIGGER 阻止事务完成。寻找其他选择。

【讨论】:

  • 最终触发器不会有 DBMS_OUTPUT
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多