儘管您可以編寫單例SELECT語句,但您應該將這兩個語句合併到一個查詢中,因爲您只對名稱感興趣,而不是對uid
值感興趣。
CREATE FUNCTION get_developers (proj_id varchar(10))
RETURNING varchar(50);
DEFINE developers varchar(200);
DEFINE dev_name varchar(50);
FOREACH SELECT u.user_name
INTO dev_name
FROM proj_dev_map AS p JOIN user AS u ON u.uid = p.user_attuid
WHERE p.project_id = proj_id
LET developers = developers || dev_name || ', ';
END FOREACH
RETURN developers;
END FUNCTION
這個SPL語法對於分號也很奇怪/挑剔。在SELECT語句之後(在LET之前),您不能有分號。 END FOREACH後面可能有一個。上面的代碼在我的數據庫上編譯。我省略了數據庫名稱,因爲除了當前數據庫之外,您不能創建任何函數(我嘗試過,Informix反對該符號 - 而不是我沒有名爲resources
的數據庫)。除非您要執行DELETE FROM proj_dev_map WHERE CURRENT OF cursor1
或UPDATE proj_dev_map SET ... WHERE CURRENT OF cursor1
,否則您不需要FOREACH中的光標名稱,儘管它沒有真正的傷害。
最小改變了代碼來獲得它來編譯(在resources
數據庫)是:
CREATE FUNCTION resources:get_developers (proj_id varchar(10))
RETURNING varchar(50);
DEFINE developers varchar(200);
DEFINE uid varchar(15);
DEFINE dev_name varchar(50);
FOREACH cursor1 FOR
select dev_user_id into uid from proj_dev_map where project_id = proj_id -- ;
select user_name into dev_name from user where user_attuid = uid;
LET developers = developers || dev_name || ', ';
END FOREACH
RETURN developers;
END FUNCTION
的區別是第一個SELECT之後被註釋掉的分號。
謝謝喬納森!還有一個關於開發者變量未被初始化的問題。我得到了-696錯誤代碼。我初始化了,它消失了。 – paulhudson