在 PostgreSQL 中,如何从过程调用中返回多个不同的表?

问题描述 投票:0回答:1

我需要从 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

postgresql stored-procedures procedure
1个回答
0
投票

啊,没关系,就像将引用游标的数据类型从 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";
© www.soinside.com 2019 - 2024. All rights reserved.