2011-09-08 135 views
3

IBM Informix Dynamic Server的版本11.50.FC6爲什麼存儲這個SQL過程需要一個臨時表創建爲它工作(返回的結果)?

我工作,將採取從表名和字段把它解析爲「用戶名」最多8個字符的小存儲過程。

這是我努力的代碼:

CREATE PROCEDURE build_jics_user (pid INT) 
    RETURNING CHAR(8) AS username; 
    SELECT LOWER((SUBSTR(firstname,0,1))||(SUBSTR(lastname,0,7))) username 
    FROM id_rec 
    WHERE id = pid; 
END PROCEDURE; 

執行時返回的錯誤是:

659: INTO TEMP table required for SELECT statement. 
Error in line 5 
Near character position 15 

我不明白召喚一個臨時表的點是什麼,我在網上也找不到任何類似的簡單例子,而且沒有錯誤。

有誰知道我錯過了什麼?

回答

4

你想說的是什麼:

CREATE PROCEDURE build_jics_user (pid INT) 
    RETURNING CHAR(8); 
    DEFINE username CHAR(8); 
    SELECT LOWER((SUBSTR(firstname,0,1))||(SUBSTR(lastname,0,7))) INTO username 
     FROM id_rec 
     WHERE id = pid; 
    RETURN username; 
END PROCEDURE; 

......像這樣執行:

EXECUTE PROCEDURE build_jics_user(42); 

UPDATE

如果這樣做的目的是成爲一個功能,其中它需要一些其他的SQL裏面,那麼你不妨做到以下幾點:

CREATE FUNCTION jics_user(fname VARCHAR(255), lname VARCHAR(255)) 
    RETURNING CHAR(8); 
    RETURN LOWER(SUBSTR(fname,0,1) || SUBSTR(lname,0,7)); 
END FUNCTION; 

...並執行這樣的:

SELECT id, firstname, lastname, jics_user(firstname, lastname) AS jics_user, ... 
    FROM id_rec; 

有一個過程和功能之間沒有任何真正的技術差別,它更斷言爲如何使用它。

+0

謝謝 - 一種新的創造過程和| Informix觸發器 – CheeseConQueso

+0

樂於幫助。如果你想用這個作爲一個已經讀你id_rec表的查詢功能,那麼這是做的非常低效的方式。看到我更新的答案。 – RET

+0

請注意......再次感謝 – CheeseConQueso

3

這個seems to be per design(它必須說明「在線類似的簡單例子」)的缺席。顯然,無論您在存儲過程中使用SELECT語句提取的數據是什麼,都無法直接返回它們。您應該將它們存儲在臨時表或變量中供以後使用。

很可能是你的SELECT語句應該是這樣的

SELECT LOWER((SUBSTR(firstname,0,1))||(SUBSTR(lastname,0,7))) INTO username 
FROM id_rec 
WHERE id = pid; 
+1

最大的可能是在這種情況下,作爲函數的變量只返回一個值 –

+0

謝謝!事實上,我現在可以看到該過程中發生了什麼(這在這種情況下似乎確實是一種功能)。用一個建議更新了答案。 –

相關問題