2015-02-10 41 views
0

我有一個存儲過程,需要幾個參數:通話功能與查詢所有參數導致

CREATE OR REPLACE FUNCTION USP_GET_FAID(IN "IN_metricsId" TEXT, 
            IN "IN_shop"  TEXT, 
            IN "IN_shopUserId" TEXT, 
            IN "IN_session"  TEXT DEFAULT NULL, 
            IN "IN_ipHash"  TEXT DEFAULT NULL, 
            IN "IN_shopSession" TEXT DEFAULT NULL, 
            IN "IN_userAgent" TEXT DEFAULT NULL) 
RETURNS INT8 AS $$ 

我想調用這個存儲過程,並通過成果提供的參數一個SELECT查詢,所以存儲過程將爲每一行運行。
我不在乎函數返回什麼,所以可以忽略它。

它怎麼可能做到(如果有的話)?

+0

函數返回什麼?你能告訴我們*完整的*函數定義嗎?順便說一句:使用帶引號的標識符幾乎總是一個不錯的選擇。從長遠來看,他們更麻煩,那麼他們是值得的。 – 2015-02-10 13:41:22

+0

@a_horse_with_no_name:謝謝 - 修正。爲什麼使用帶引號的標識符是一個不好的選擇? – 2015-02-10 13:45:35

+0

因爲它們區分大小寫。 – 2015-02-10 13:46:39

回答

3

如果函數只返回一個值和參數都來自select語句,你可以簡單地把它叫做選擇列表中:

select shop_id, usp_get_faid(metrics_id, shop, shop_id, shop_user_id, session, ip_hash, shop_session, user_agen) 
from session_table 

這是假設所有的列是session_table的一部分表。

+0

OP不關心(忽略)結果,所以即使函數返回多個值,這也應該是安全的。 – pozs 2015-02-10 14:01:18

+0

@a_horse_with_no_name:非常感謝!這是一個優雅簡單的解決方案!... – 2015-02-10 14:28:10

+1

請注意非'VOLATILE'功能。他們可能會被優化掉。此外,您可能需要獲取查詢的所有結果 – 2015-02-10 18:02:12

1

如果所有的輸入參數來自單個表,可以簡化,只是傳遞一個行類型:

CREATE OR REPLACE FUNCTION usp_get_faid(_tbl my_tbl) 
    RETURNS int8 AS ... 

然後:

SELECT usp_get_faid(t) FROM my_tbl t WHERE my_tbl_id = 123; 

不要緊,如果表中包含一些實際上不需要的額外列。只需使用你需要的...

這實際上適用於任何組合的列,但你需要一個註冊的行類型,並且有一個行類型自動註冊爲每個表。