【问题标题】:Birt Report - Not gettting data from Postgres RefCursorBirt Report - 没有从 Postgres RefCursor 获取数据
【发布时间】:2013-12-23 17:19:00
【问题描述】:

我有这个:

POSTGRES

/*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;

BIRT

数据集 --> 我的数据集 --> select * from test_birt(?::bigint)

截图如下:

报表设计

报告预览

我需要 Birt 显示 MY_TABLE 的值!!。在这种情况下,此表有一个 varchar 字段,其值:TEST1TEST2TEST3Birt 版本是 3.2postgres9.2

注意我发现的独特解决方案是创建一个数据类型并从我的函数中更改返回数据类型,如下所示:

RETURNS SETOF my_type AS

但我需要 Bird 可以读取此 RefCursor。

【问题讨论】:

    标签: postgresql birt


    【解决方案1】:

    你错过了一个 FETCH 语句。

    当您调用函数时,会创建(并打开)光标“tcursor”。但没有人试图从中读取。如果没有 Birt 的明确支持,就不可能调用函数并从游标中获取数据。您可以尝试一个 hack - 是否可以工作(取决于 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 2011-02-02
      • 2023-01-20
      • 1970-01-01
      • 2018-01-10
      相关资源
      最近更新 更多