我需要从 PostgreSQL 存储过程返回两个(或更多)查询。
相当于这个 mssql-query(注意:简单的例子 - 更复杂的查询):
CREATE PROCEDURE dbo.TestMe
AS
BEGIN
SELECT * FROM T_FMS_Configuration;
SELECT * FROM T_FMS_Navigation;
END
GO
现在我想将它们移植到 postgresql。
到目前为止我所做的:
将其作为函数来实现:
CREATE OR REPLACE FUNCTION public.get_data_from_multiple_schemas(id integer, ref1 refcursor, ref2 refcursor)
RETURNS SETOF refcursor
LANGUAGE plpgsql
AS $function$
BEGIN
OPEN ref1 FOR SELECT * FROM dbo."T_FMS_Configuration";
RETURN NEXT ref1;
OPEN ref2 FOR SELECT * FROM dbo."T_FMS_Navigation";
RETURN NEXT ref2;
END;
$function$
;
SELECT get_data_from_multiple_schemas(69, 'Ref1', 'Ref2');
FETCH ALL IN "Ref1";
FETCH ALL IN "Ref2";
但这是一个函数。
我可以按照这样的程序来完成:
-- 如何像我们在 MS SQL 过程中那样从 PostgreSQL 函数返回多个选择查询
DROP PROCEDURE IF EXISTS sp_GiveMeTwoResults();
CREATE OR REPLACE PROCEDURE sp_GiveMeTwoResults()
LANGUAGE plpgsql
AS
$$
BEGIN
-- Suppress row count messages
PERFORM set_config('client_min_messages', 'warning', false);
-- Create a temporary table to store the result
DROP TABLE IF EXISTS temp_result1;
CREATE TEMP TABLE temp_result1 AS
SELECT * FROM dbo."T_FMS_Configuration";
DROP TABLE IF EXISTS temp_result2;
CREATE TEMP TABLE temp_result2 AS
SELECT * FROM dbo."T_FMS_Navigation";
-- Select data from the temporary table
-- You can adjust this query as needed
-- SELECT * FROM temp_result;
-- Optionally drop the temporary table when you're done
-- Reset client_min_messages to its default value (optional)
PERFORM set_config('client_min_messages', 'notice', false);
END;
$$;
CALL sp_GiveMeTwoResults();
SELECT * FROM temp_result1;
SELECT * FROM temp_result2;
但这会创建临时表。
是否不可能在过程中像在函数中那样以相同的方式执行此操作? 例如我想要
CREATE OR REPLACE PROCEDURE get_two_datasets(OUT cursor1 refcursor, OUT cursor2 refcursor)
LANGUAGE plpgsql
AS
$$
BEGIN
-- Open the first refcursor and populate it with data
OPEN cursor1 FOR SELECT * FROM dbo."T_FMS_Configuration";
-- Open the second refcursor and populate it with data
OPEN cursor2 FOR SELECT * FROM dbo."T_FMS_Navigation";
END;
$$;
CALL get_two_datasets('Ref1', 'Ref2');
-- CALL get_two_datasets(ref1 => 'Ref1', ref2 => 'Ref2'); -- not working either
FETCH ALL IN "Ref1";
FETCH ALL IN "Ref2";
但我在这里得到:
错误:光标»Ref1«不存在
FEHLER:游标“Ref1”不存在 SQL 状态:34000
啊,没关系,就像将引用游标的数据类型从 out 更改为 inout 一样简单...
DROP PROCEDURE IF EXISTS get_two_datasets;
CREATE OR REPLACE PROCEDURE get_two_datasets
(
INOUT result_data1 refcursor
,INOUT result_data2 refcursor
)
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
OPEN result_data1 FOR SELECT * FROM dbo."T_FMS_Configuration" LIMIT 10;
OPEN result_data2 FOR SELECT * FROM dbo."T_FMS_Navigation" LIMIT 10;
END
$BODY$;
CALL get_two_datasets(result_data1 => 'Ref1', result_data2 => 'Ref2');
FETCH ALL IN "Ref1";
FETCH ALL IN "Ref2";