2011-07-22 41 views
0

一位同事(PL/SQL有限的技能與我的匹配!)試圖創建一個觸發器(基於Oracle的)ERP系統的後端。使用以下樣本,他爲我簡化了這個問題。PL/SQL觸發器中的SELECT語句返回null

總之,他有使預期結果的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; 

我沒有專家,但在表面看來,這似乎沒問題。任何人都可以建議嗎?

有沒有其他方法可以嘗試?並進一步建議如何調試呢?

+2

我看不出什麼錯。觸發器肯定是射擊嗎?例如如果你改變它做':new.url5:='xxx';'是否會發生? –

+0

@託尼安德魯斯:對不起,我趕緊發佈這個;是的,我的同事已經嘗試過了 - URL被設置爲他指定的字面值,這似乎表明觸發器正在觸發。 – CJM

+0

'QUOTATION_NO ='G1002387''是否有一排? –

回答

3
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' 

此示例工作正常。我沒有看到任何錯誤。