【问题标题】:Why doesn't this PL/SQL trigger show any result?为什么这个 PL/SQL 触发器不显示任何结果?
【发布时间】:2020-05-01 16:56:05
【问题描述】:

我需要编写一个触发器,输出工资已被修改的员工的名字和姓氏。当员工的旧工资小于 10,000 并且修改后大于 10,000 时,此触发器将起作用。此触发器必须是行触发器

我写了这个:

CREATE OR REPLACE TRIGGER print_info
AFTER UPDATE OF salary ON employees
FOR EACH ROW
DECLARE fname employees.first_name%type; lname employees.last_name%type;
BEGIN
IF(:OLD.salary < 10000 AND :NEW.salary > 10000) THEN
  dbms_output.put('fname, lname');
END IF;
END;
/

此代码编译成功,触发器创建成功,但是当我更新员工的工资时,在触发器要求内,触发器不执行或不显示任何内容。

我在这里做错了吗?

感谢您的帮助。

【问题讨论】:

  • 触发器不能“显示任何东西”。触发器在服务器中执行,服务器无法在任何人的屏幕上显示任何内容。它可以做的是写入缓冲区(使用 DBMS_OUTPUT),然后客户端程序可以获取并显示缓冲区的内容。你的客户程序是什么? SQL*Plus?
  • 是的,我正在使用 sqlplus
  • 在更新员工工资之前使用SET SERVEROUT ON
  • 显示静态字符串的目的是什么?
  • 在 SQL*Plus 中,在运行块后立即键入 show errors 以查看编译错误。

标签: oracle plsql


【解决方案1】:

只需在dbms_output.put 之后添加dbms_output.new_line; 或使用dbms_output.put_line

    CREATE OR REPLACE TRIGGER print_info
    AFTER UPDATE OF salary ON employees
    FOR EACH ROW
    DECLARE fname employees.first_name%type; lname employees.last_name%type;
    BEGIN
    IF(:OLD.salary < 10000 AND :NEW.salary > 10000) THEN
      dbms_output.enable; 
      dbms_output.put('fname, lname '||:NEW.first_name||','||:NEW.last_name);
      dbms_output.new_line;
    END IF;
    END;

【讨论】:

  • 您好,感谢您的帮助,但这似乎不起作用,我仍然没有结果:(
  • 您好,我已启用 dbms_output ,请尝试使用最新代码
  • 反斜杠告诉 sqlplus 停止阅读更多行并提交它所拥有的内容。这说明要继续执行 CREATE。 SHOW ERRORS 是一个 sqlplus 命令,在 CREATE 编译并报告它有错误之后 执行。 SHOW SERRORS 出现在 反斜杠之后。但这仍然是一个非常糟糕的主意。您不应期望触发器“显示”任何内容。而且由于 dbms_output 的工作方式,它确实应该在生产代码中用作与用户交流的一种方式。
  • 我建议您花时间熟悉一些 Oracle 文档。几个起点将是 SQL*PLUS users guide2Day Developer's Guide 一旦你对这些感到满意,看看 Oracle Database Concepts。或者您的特定 Oracle 版本的相应指南(所有当前支持的版本都有自己的)。
  • @WilliamRobertson - 你是绝对正确的。我一定是脑子里放了个屁才说这是反斜杠。
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多