gpt4 book ai didi

sql - 测试使用并返回 refcursor 的 PostgreSQL 函数

转载 作者:行者123 更新时间:2023-11-29 11:21:41 25 4
gpt4 key购买 nike

我想测试 Postgres 函数的结果(不可能更改函数)。

该函数接收一个 REFCURSOR 和其他一些东西作为参数,并返回相同的 RECURSOR。

get_function_that_returns_cursor(ret, 4100, 'SOMETHING', 123465)

现在我想在 Postgres 中创建一个小测试来获得这个函数的结果。类似于下面的代码(这是我的方法,但它不起作用):

DO $$ DECLARE
ret REFCURSOR;
row_to_read table_it_will_return%ROWTYPE ;
BEGIN
PERFORM get_function_that_returns_cursor(ret, 4100, 'SOMETHING', 123465);
-- OR SELECT get_function_that_returns_cursor(ret, 4100, 'SOMETHING', 123465) INTO ret
FOR row_to_read IN SELECT * FROM ret LOOP
-- (...)
RAISE NOTICE 'Row read...';
END LOOP;
CLOSE ret;
END $$;

关于如何让它工作的任何建议?可用于测试此类函数的通用解决方案(获取 Cursor 并返回 Cursor?

如果我们不知道返回的行类型,我们怎么办?

最佳答案

Q1

您的“小测试”可以是纯 SQL:

BEGIN;
SELECT get_function_that_returns_cursor('ret', 4100, 'foo', 123); -- note: 'ret'
FETCH ALL IN ret; -- works for any rowtype

COMMIT; -- or ROLLBACK;

执行COMMIT/ROLLBACK检查结果后。大多数客户端只显示 lat 命令的结果。

更多内容在 Returning Cursors 章节中手册。

Q2

And if we don't know the rowtype that is being returned how could we do it?

由于您只想检查结果,您可以将整个记录转换为文本。这样您就可以完全避免函数的动态返回类型的问题。

考虑这个演示:

CREATE TABLE a (a_id int PRIMARY KEY, a text);
INSERT INTO a VALUES (1, 'foo'), (2, 'bar');


CREATE OR REPLACE FUNCTION reffunc(INOUT ret refcursor)
LANGUAGE plpgsql AS
$func$
BEGIN
OPEN ret FOR SELECT * FROM a;
END
$func$;


CREATE OR REPLACE FUNCTION ctest()
RETURNS SETOF text
LANGUAGE plpgsql AS
$func$
DECLARE
curs1 refcursor;
rec record;
BEGIN
curs1 := reffunc('ret'); -- simple assignment

LOOP
FETCH curs1 INTO rec;
EXIT WHEN NOT FOUND; -- note the placement!
RETURN NEXT rec::text;
END LOOP;
END
$func$;

db<> fiddle here
<子> Old sqlfiddle

关于sql - 测试使用并返回 refcursor 的 PostgreSQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15671636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com