我想测试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中调试此类事情的最佳方法是什么
您的“小测试”可以是普通的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 __
COMMIT
ROLLBACK
本手册的“ 返回光标 ”一章中有更多内容。
由于您只想检查结果,因此可以 将整个记录投射到text。这样,您就可以完全避免该函数的动态返回类型的问题。
text
考虑这个演示:
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;
- > SQLfiddle的