2010-07-19 73 views
0

越來越接近運行我的第一個存儲過程。這一次編譯,但是當我 call test.fttest5('YEAR');運行它,它拋出一個錯誤這個存儲過程有什麼問題?

SQL狀態:22001 供應商代碼:-303 消息:[SQL0303] Host變量* N不兼容。原因。 。 。 。 。 :由於主機變量* N的數據類型與相應列表項的數據類型不兼容,因此無法執行FETCH,SELECT,CALL,SET,VALUES INTO,GET DIAGNOSTICS,GET DESCRIPTOR或SET DESCRIPTOR。

另外如何在我的存儲過程中指定無限數據類型?我試過DECLARE temp VARCHAR(MAX);但它沒有奏效。我的平臺是ISeries DB2 V5R4。

create procedure test.fttest5 
    (IN ftExpression CHARACTER(30)) 
    language sql 
    reads sql data 
    dynamic result sets 1 
    begin 

    declare cmd VARCHAR(50); 
    declare whr VARCHAR(50) 
; 

    declare x cursor for sl; 
    set cmd='select * from testSchema.tempTable' ; 
    if ftExpression IS NOT NULL 
THEN 
    set whr= ftExpression; 
    END IF; 

    set cmd=cmd || CASE WHEN whr IS NULL THEN '' ELSE ' ORDER BY ' || whr END; 
    prepare sl from cmd; 
    open x; 
    return; 
    end 
    ; 

回答

2

我相信你在這裏得到的錯誤實際上是在你的程序被調用之前發生的。您已經使用一個CHAR參數定義了該過程,但您正在使用VARCHAR調用該參數。當您以交互方式鍵入SQL時,就像參數以VARCHAR的形式出現一樣。

嘗試調用它像這樣:call test.fttest5(CHAR('YEAR'))

或者你可以更改的參數是一個VARCHAR過,但你還是會想測試用CHAR調用它,看看會發生什麼。

但是我認爲你錯過了SET RESULT SETS CURSOR x行。因爲我認爲訂單可能很重要,所以我會在宣佈前進行準備。

IBM文檔位於http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/rzaik/rzaikspresultsets.htm

+0

謝謝,我會研究你說的話,並保持這個線程張貼! – 2010-07-19 19:57:39

+0

想通了,謝謝。你在現場。 – 2010-07-21 11:17:04

1

選擇*是壞的,特別是如果你是從複雜的或大的意見進行選擇。

遊標一般不好,因爲您遍歷每一行而不是使用集合。

還想一想這裏是否需要動態SQL?

此存儲過程的缺點是什麼?它看起來很簡單,我想知道是否可以使用集重寫它,而不是用光標迭代?

+0

感謝您的回覆,它只是一個示例聲明和測試程序。實際的場景是長過濾器和搜索查詢(DYNAMIC WHERE&ORDER BY)的動態where子句。現在我所知道的是,我必須使用光標來讓我的存儲過程正常工作,你能告訴我如何使用我的示例集? – 2010-07-19 11:57:10