PL/SQL 触发器中的 SELECT 语句返回 null

Posted

技术标签:

【中文标题】PL/SQL 触发器中的 SELECT 语句返回 null【英文标题】:SELECT statement in PL/SQL Trigger returns null 【发布时间】:2011-07-22 13:30:30 【问题描述】:

一位同事(我的 PL/SQL 技能有限!)正在尝试为(基于 Oracle 的)ERP 系统的后端创建触发器。他通过以下示例为我简化了问题。

简而言之,他有一个渲染预期结果的select语句:

SELECT TO_CHAR(MAX(
RESULT_KEY))
FROM IFSINFO.QUOTATION_REPORTS
WHERE QUOTATION_NO = 'G1002387'

...但是当包含在触发器中时似乎返回 null:

CREATE OR REPLACE TRIGGER VMO_QUOTATION_LINK
BEFORE INSERT OR UPDATE
ON VMO_OPPORTUNITY_LINE
FOR EACH ROW

DECLARE
  QuotationLink VARCHAR2(255);

BEGIN
  SELECT TO_CHAR(MAX(RESULT_KEY))
  INTO QuotationLink
  FROM IFSINFO.QUOTATION_REPORTS
  WHERE QUOTATION_NO = 'G1002387';

  :NEW.URL5 := QuotationLink;
END;

我不是专家,但从表面上看,这似乎还可以。谁能给点建议?

我可以尝试其他方法吗?以及有关如何调试的进一步建议?

【问题讨论】:

我看不出有什么问题。触发器肯定会触发吗?例如如果您将其更改为 :new.url5 := 'xxx'; 会发生这种情况吗? @Tony Andrews:对不起,我急着发这个;是的,我的同事已经尝试过了 - URL 设置为他指定的文字,这似乎表明触发器正在触发。 QUOTATION_NO = 'G1002387' 有一行吗? IFSINFO.QUOTATION_REPORTS 中是否肯定存在 QUOTATION_NO = 'G1002387' 的现有记录?? StevieG,ypercube - 正如我之前所说,SELECT 语句本身返回预期结果 - 只有在触发器内部时它才会返回 null。 【参考方案1】:
create table quotation_reports (quotation_no varchar2(30), result_key number);

insert into quotation_reports values ('G1002387', 1);
insert into quotation_reports values ('G1002387', 10);

SQL> select to_char(max(result_key)) from quotation_reports where quotation_no = 'G1002387';

TO_CHAR(MAX(RESULT_KEY))
----------------------------------------
10

create table vmo_opportunity_line(url5 varchar2(300), test_column varchar2(100));

CREATE OR REPLACE TRIGGER VMO_QUOTATION_LINK
BEFORE INSERT OR UPDATE ON VMO_OPPORTUNITY_LINE
FOR EACH ROW
   DECLARE
QuotationLink VARCHAR2(255);
BEGIN
    SELECT TO_CHAR(MAX(RESULT_KEY))   INTO QuotationLink
    FROM QUOTATION_REPORTS
WHERE QUOTATION_NO = 'G1002387';
    :NEW.URL5 := QuotationLink;
END;

insert into vmo_opportunity_line(test_column) values ('A');

select * from vmo_opportunity_line;

URL5        TEST
-----       ------
10          'A'

此示例运行良好。我没看出有什么问题。

【讨论】:

以上是关于PL/SQL 触发器中的 SELECT 语句返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Oracle的PL_SQL的异常处理

PL/SQL 在 CASE 语句中返回一个列表

语句触发器 PL/SQL

使用 PL/SQL 游标为报告工具返回结果集

PL/SQL流程控制

什么是PL/SQL