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

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

该函数将REFCURSOR和其他一些内容作为参数接收,并返回相同的RECURSOR。

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

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

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 $$;

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

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

在PostgresQL中调试此类事情的最佳方法是什么

回答:

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/ 。大多数客户端仅显示lat命令的结果。ROLLBACK __

本手册的“ ”一章中有更多内容。

第2季

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

由于您只想检查结果,因此可以 。这样,您就可以完全避免该函数的动态返回类型的问题。

考虑这个演示:

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) AS -- INOUT param :)

$func$

BEGIN

OPEN ret FOR SELECT * FROM a;

END

$func$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION ctest()

RETURNS SETOF text 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$ LANGUAGE plpgsql;

以上是 测试使用并返回refcursor的PostgreSQL函数 的全部内容, 来源链接: utcz.com/qa/418253.html

回到顶部