我想测试一个Postgres函数的结果(改变功能的可能性也不大)。
该函数接受作为参数,一个指针和其他一些东西,返回相同的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 $$;
在任何建议如何得到这个工作? 可用于测试这种类型的功能的通用解决方案(即获得一个游标并返回游标?
如果我们不知道正在返回的行类型我们怎么能做到这一点?
什么是调试这种在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
/ ROLLBACK
您检查后的结果。 大多数客户只显示经纬度命令的结果。
更一章中的返回游标的手册。
Q2
如果我们不知道正在返回的行类型我们怎么能做到这一点?
既然你只需要检查的结果,你可以投的整个记录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
这个工作对我想要的东西:
DO $$ DECLARE
mycursor REFCURSOR;
rec RECORD;
BEGIN
SELECT 'ret' INTO mycursor FROM get_function_that_returns_cursor('ret'::REFCURSOR, 4100, 'SOMETHING', 123465);
WHILE (FOUND) LOOP
FETCH mycursor INTO rec;
RAISE NOTICE 'Row read. Data: % ', rec.collumn_name;
END LOOP;
END $$