我有这个:
/*THE PARAMETER in_test_id IS ONLY A TEST!!*/
CREATE OR REPLACE FUNCTION public.test_birt(in_test_id bigint DEFAULT NULL::bigint)
RETURNS refcursor AS
$BODY$
DECLARE
query text;
tcursor refcursor = 'tcursor';
BEGIN
query := 'SELECT * FROM MY_TABLE';
OPEN tcursor FOR execute query;
return tcursor;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
DATASET - > MyDataset - > select * from test_birt(?::bigint)
这里有截图:
报告设计
报告预览
我需要 Birt 显示 MY_TABLE !!的值。在这种情况下,此表格有一个 varchar 字段,其值为: TEST1 , TEST2 , TEST3 。 Birt 版本 3.2 , postgres 9.2 。
注意我找到的唯一解决方案是创建数据类型并从我的函数更改返回数据类型,如下所示:
RETURNS SETOF my_type AS
但是我需要Bird可以阅读这个RefCursor。
答案 0 :(得分:3)
你错过了一个FETCH声明。
调用函数时,会创建(并打开)光标“tcursor”。但没有人试图从中读取。如果没有Birt中的明确支持,则无法调用函数并从游标中获取数据。您可以尝试黑客 - 可以工作与否(取决于Birt中的实现) - 使用以下命令作为数据集的来源:
SELECT test_birt(?::bigint); FETCH ALL FROM tcursor;
我发现link表明Birt 5年前并不支持它。
另一方面。在9.2中,您不需要为返回表定义自己的类型。您可以使用表类型 - 何时可以返回所有列,或者可以通过TABLE关键字定义输出列:
CREATE TABLE foo(a int, b int); -- automatically it defined type foo
CREATE OR REPLACE FUNCTION read_from_foo_1(_a int)
RETURNS SETOF foo AS $$
SELECT * FROM foo WHERE foo.a = _a;
$$ LANGUAGE SQL;
或
CREATE OR REPLACE FUNCTION read_from_foo_2()
RETURNS TABLE(a int, b int, c int) AS $$
SELECT a, b, a + b FROM foo;
$$ LANGUAGE SQL;