2011-07-22 4 views
0

(Oracleとの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; 

私は専門家はいませんが、それに直面してもOKです。誰も助言することはできますか?

私は試してみることのできる代替アプローチがありますか?これをデバッグする方法についてさらに提案しますか?

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

このサンプルは正常です。私は何か間違っているとは思わない。

関連する問題