【发布时间】:2014-04-21 22:55:52
【问题描述】:
我从 SQL Server 世界来到 PostgreSQL (9.0),在迁移存储过程/函数时遇到问题。该函数正在返回此错误消息:
SQLSTATE: 42601;
SQLERRM: query has no destination for result data
我需要同时返回查询结果和两个输出参数。查询结果表示为名为“paramName”和“value”的两列,每个选择查询有一行数据。
我需要做些什么来传递查询选择的列中的值以及不同结果集中的 OUT 参数,例如 Transact-SQL 可以完美地避免收到该错误消息?
这是 pl/pgsql 函数:
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 SETOF RECORD AS
$BODY$
DECLARE
val1 varchar;
val2 varchar;
val4 varchar;
BEGIN
-- A couple of IF THEN ommited here
IF (v_solution_id IS NULL) THEN
val1 := (Select 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;
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 'mycolumnname3' as paramName,mycolumn3 as value FROM tb2
WHERE column1 = val1 AND
column4 = val4;
o_call_status := 0;
o_call_message := '';
RETURN;
EXCEPTION WHEN OTHERS THEN
o_call_message := SQLERRM;
o_call_status := SQLSTATE;
end;
我得到的只是查询结果或结果集中的输出参数。我无法弄清楚如何在相同的函数响应中同时拥有两者。
更新:按照 Erwin 的建议使用游标实现:
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 refcursor AS
$BODY$
DECLARE
val1 varchar;
val2 varchar;
query_cursor refcursor;
BEGIN
-- A couple of IF THEN ommited here
IF (v_solution_id IS NULL) THEN
val1 := (Select 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;
END IF;
open query_cursor for 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 'mycolumnname3' as paramName,mycolumn3 as value FROM tb2
WHERE column1 = val1 AND
column4 = val4;
o_call_status := 0;
o_call_message := '';
RETURN query_cursor;
EXCEPTION WHEN OTHERS THEN
o_call_message := SQLERRM;
o_call_status := SQLSTATE;
end;
select * from myplfunction(param1,param2,param3,param4);
但我得到一个错误:
ERROR: function result type must be record because of OUT parameters
SQL state: 42P13
所以这意味着当我有 OUT 参数时我不能返回光标?
另外,IF THEN 子句中的return; 是否会按预期终止函数?
【问题讨论】:
-
您至少需要提供整个功能。
-
嗨@Bob 我刚开始时省略了几个
IF THEN就这样
标签: sql database postgresql plpgsql