2013-04-27 32 views
1

在Informix中的存儲過程我有一些條件這是這樣的: -如果裏面如果Informix中的存儲過程

 If val1 > 0     // 1st If 
    Select count(*) of value from a table and stored it in a Variable say VALUE 
    If VALUE > 0     // 2nd If 
    perform UPDATE 
    ELSE       // Intended ELSE for 2nd IF 
    Perform Insert 
    END IF 
    ELSE       // Intended ELSE for 1st IF 
    perform Operation X 
    END IF 

一些我怎麼看我的execution is always going in ELSE Intended for 1st IF,這對我來說是創造一個問題。可以SomeOne讓我知道如何糾正這個或我在哪裏 錯了。 Regards

回答

2

在if之前包含下面的命令。

set debug file to '/tmp/trace.out'; 
trace on ; 
.... 
trace "Value of val1 ="||val1; 
trace "Value of VALUE = "||VALUE; 

運行的程序,並檢查/tmp/trace.out文件的輸出上所在的服務器數據庫。 的命令參考,使用在線手冊:TRACESET DEBUG FILE

+0

字符串連接中的NULL會產生一個NULL字符串。使用val1 =「||的TRACE」值是非常好的做法NVL(val1,「NULL」);'。因爲喬納森的診斷結果是雙重的。 – RET 2013-04-29 02:46:20

3

的明確關鍵字END IF意味着IF在SPL語句是明確的嵌套。翻譯和縮進你的代碼產量:

IF val1 > 0 THEN 
    SELECT COUNT(*) INTO value FROM SomeTable; 
    If VALUE > 0 THEN 
     Perform UPDATE 
    ELSE 
     Perform INSERT 
    END IF 
ELSE 
    Perform Operation X 
END IF 

有沒有辦法讓這裏有任何歧義;由於明確的END IF符號,沒有'懸掛其他'的問題。

如果錯誤的代碼正在執行,那麼您可能被三值邏輯和比較行爲(當其中一個比較值爲NULL時)捕獲。例如,如果val1爲NULL,那麼將始終執行perform Operation X,因爲val1 > 0NULL > 0,其計算結果爲NULL,這不是TRUE,因此執行ELSE子句並執行操作X.

由於noted通過ceinmart,您可以使用SET DEBUG FILETRACE ON調試發生了什麼,你執行存儲過程。