[英]Issue when migrating Stored Procedure from SQL Server to PostgreSQL
我從SQL Server到PostgreSQL(9.0),所以在執行存儲過程/函數時遇到問題。 該函數返回此錯誤消息:
SQLSTATE:42601;
SQLERRM:查詢沒有結果數據的目的地
我需要做的是將SELECT
查詢選擇的列中的值與OUT
參數一起傳遞到結果中,並避免收到該錯誤消息?
CREATE OR REPLACE FUNCTION myplfunction(
IN i_param1 character varying,
IN i_param2 character varying,
IN i_param3 character varying,
IN i_param4 character varying,
OUT o_call_status integer,
OUT o_call_message character varying)
RETURNS record AS
$BODY$
DECLARE
val1 varchar;
val2 varchar;
...
IF (v_solution_id IS NULL) THEN
val1 := column1 FROM tbl2 WHERE column2= i_param1;
IF(val1 IS NULL) THEN
o_call_status := 1005;
o_call_message := column1 is not configured or invalid';
RETURN;
END IF;
SELECT 'mycolumnname1' as paramName,mycolumn1 as value FROM tb1 WHERE column1 = val
UNION ALL
SELECT 'mycolumnname2' as paramName,,mycolumn2 as value FROM tb1 WHERE column1 = val
UNION ALL
SELECT 'mycolumnname2' as paramName,,mycolumn2 as value FROM tb2 WHERE column2 = val2
WHERE tb2paramName4=i_val3;
o_call_status := 0;
o_call_message := '';
EXCEPTION WHEN OTHERS THEN
o_call_message := SQLERRM;
o_call_status := SQLSTATE;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
通常,PostgreSQL函數僅返回一個值(或行)或一組值(或行),但不會並行返回。
您可以直接從該函數返回集合或行,從而使其成為“ 集合返回函數 ”,也稱為“ 表函數 ”。 然后,除了向每一行返回參數o_call_status
和o_call_message
,您o_call_message
(實際上,如果您真的需要它們嗎?!)
CREATE OR REPLACE FUNCTION myplfunction(i_val1 int, i_val2 int)
RETURNS TABLE (col1 text, col2 text -- use matching types!
, o_call_status text -- text, not int
, o_call_message text) AS
$func$
BEGIN
RETURN QUERY
SELECT col1, col2
, '0'::text AS o_call_status
, ''::text AS o_call_message -- column aliases irrelevant here
FROM tb1
WHERE col3 = i_val1
UNION ALL
SELECT col4, col5, '0'::text, ''::text
FROM tb2
WHERE col6 = i_val2
AND col7 = i_val3; -- WHERE was specified twice
EXCEPTION WHEN OTHERS THEN
RETURN QUERY
SELECT NULL::text, NULL::text, SQLERRM, SQLSTATE;
END
$func$ LANGUAGE plpgsql;
特殊變量SQLERRM
的類型為text
,btw。 不是integer
。
否則,您將不得不打開一個游標以將返回的表與這兩個參數解耦。
CREATE OR REPLACE FUNCTION myplfunction(
i_val1 text, i_val2 text, i_val3 text, i_val4 text
, OUT o_call_status text
, OUT o_call_message text) AS
$func$
DECLARE
curs CURSOR FOR
SELECT col1, col2 FROM tb1
WHERE col3 = i_val1
UNION ALL
SELECT col4, col5 FROM tb2
WHERE col6 = i_val2
AND col7 = i_val3;
BEGIN
OPEN curs;
o_call_status := '0';
o_call_message := '';
EXCEPTION WHEN OTHERS THEN
o_call_status := SQLSTATE;
o_call_message := SQLERRM;
END
$func$ LANGUAGE plpgsql;
但是 ,游標僅存在於同一事務中。 因此,您需要在COMMIT
或ROLLBACK
之前獲取值。
BEGIN;
SELECT * FROM myplfunction (10, 20, 30, 40);
FETCH ALL IN curs;
ROLLBACK;
您甚至可以輸入任意的游標名稱。 本手冊中的其他內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.