2011-05-05 86 views
1

在我的存儲過程,我做了很多:IBM solidDB中,獲取結果失敗,因爲沒有結果EN執行語句

EXEC SQL EXECUTE ...

EXEC SQL FETCH ...

但是,當執行語句沒有返回任何內容時,我收到一些錯誤(錯誤23506:遊標中的表結束),並試圖獲取結果。 反正在試圖獲取它之前檢查結果是否包含任何內容?

我試過SQLSUCCESS和SQLROWCOUNT,但SQLSUCCESS只告訴我該語句是否不失敗,如果它返回任何東西,並且SQLROWCOUNT顯然只適用於插入,更新和刪除。不選擇語句。

+0

也許你應該多發一點代碼。 – 2011-05-05 10:05:53

回答

1

This reference比較DB2和SolidDB過程。

在「清單15. SQLSUCCESS顯示結果集的結尾」一節中,IBM參考顯示了此片段。

EXEC SQL FETCH sel_tab; 
WHILE SQLSUCCESS LOOP 
    EXEC SQL FETCH sel_tab; 
END LOOP 

它還說

當抓取遊標語句失敗 並沒有找到另一行 檢索,SQLSUCCESS的值 設置爲0,while循環結束。

這幾乎告訴 while循環甚至不應該,如果是第一次EXEC SQL FETCH沒有找到一個行中輸入。但是你似乎暗示你的代碼沒有發生這種情況。

稍後,在「表7. solidDB SQLERROR of cursorname語句」中,它顯示了此代碼。 (我的註解。)

"CREATE PROCEDURE tabs_in_schema (schema_nm 
    VARCHAR) RETURNS (nr_of_rows INTEGER) 
BEGIN 
    DECLARE tab_nm VARCHAR; 
    EXEC SQL PREPARE sel_tab      -- A SELECT statement 
    SELECT table_name FROM sys_tables 
        WHERE table_schema = ?; 
    EXEC SQL PREPARE ins_tab 
     INSERT INTO my_table (table_name, 
      schema) VALUES (?,?); 
    nr_of_rows := 0; 
    EXEC SQL EXECUTE sel_tab USING    -- Executes the SELECT 
     (schema_nm)INTO (tab_nm); 
    EXEC SQL FETCH sel_tab;      -- EXEC SQL FETCH first row 
    WHILE SQLSUCCESS LOOP       -- Like listing 15 
     nr_of_rows := nr_of_rows + 1; 
    EXEC SQL EXECUTE ins_tab USING 
      (tab_nm, schema_nm); 
    IF SQLROWCOUNT <> 1 THEN 
     RETURN SQLERROR OF ins_tab; 
    END IF; 
    EXEC SQL FETCH sel_tab;      -- FETCH subsequent rows 
    END LOOP 
END"; 

我想你會喜歡

SELECT COUNT(your_column_name) 
FROM your_table 
WHERE ...; 

COUNT(執行的東西),只要您的查詢有效,將始終返回至少一行。但是這涉及更多的往返數據庫。我認爲你最好堅持試圖取得連勝的習慣,並抓住錯誤。

+0

我只想着提取一行而不循環幾行。但是問題是一樣的,那就是當沒有要讀取的行時,第一個EXEC SQL FETCH失敗並出現SolidDB錯誤。這就是爲什麼我想在EXECUTE和FETCH之間進行檢查,所以我知道我是否應該取得某些東西。 – user739447 2011-05-05 12:48:40

+0

我很確定你不能在SolidDB下做到這一點。 'EXEC SQL EXECUTE sel_tab USING ...'執行您準備並存儲在'sel_tab'中的語句,但它在服務器上執行 - 它僅向客戶端返回SQLSUCCESS。除非我錯過了某些東西,否則SolidDB希望您獲取一行並捕獲錯誤。 – 2011-05-05 14:18:57