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的主要内容,如果未能解决你的问题,请参考以下文章