2012-10-10 62 views
1

我正在嘗試創建以下函數,但未成功編譯。我不確定問題出在哪裏。這是我第一次嘗試這個。有人可以指出錯誤嗎?創建Informix函數時出錯

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 

我只是想獲取與給定的proj_id關聯的名稱作爲逗號分隔值。

回答

2

儘管您可以編寫單例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 cursor1UPDATE 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之後被註釋掉的分號。

+0

謝謝喬納森!還有一個關於開發者變量未被初始化的問題。我得到了-696錯誤代碼。我初始化了,它消失了。 – paulhudson