【问题标题】:BIRT 2.2 dynamic schema nameBIRT 2.2 动态模式名​​称
【发布时间】:2009-03-02 19:15:06
【问题描述】:

是否可以在 BIRT 查询中使模式名称动态化。

我试过了:

SELECT CURRENT DATE AS DATE, 
(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'
      WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'
      END) AS DAYOFWEEK
FROM **?**.COBOL_CALENDAR
 WHERE SERVICE_DATE = CURRENT DATE"

这会产生以下错误: 以下项目有错误:

ReportDesign (id = 1): 
+ Cannot get the result set metadata.
SQL statement does not return a ResultSet object.
SQL error #1: [IBM][CLI Driver][DB2] SQL0104N  An unexpected token "?" was found following "".  Expected tokens may include:  "( TABLE FINAL <IDENTIFIER> XMLTABLE".  SQLSTATE=42601

但是 ?似乎只适用于 where 子句。

我需要将架构作为参数传递并动态使用,因为它会根据 dev/cat/prod 进行更改

有没有办法在 birt xml 外部生成 sql 并以某种方式注入它??

我对该主题进行了更多搜索并找到了此解决方案

<method name="beforeOpen"><![CDATA[this.queryText = "SELECT CURRENT DATE AS DATE, "+
"(CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'"+
"      WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'"+
"      END) AS DAYOFWEEK"+
"FROM "+params["SCHEMA"]+".COBOL_CALENDAR"+
" WHERE SERVICE_DATE = CURRENT DATE";]]></method>

但是,无论有多少关于此问题的示例,以这种方式注入 sql 只会产生以下错误。

ReportDesign (id = 1): 
+ Cannot get the result set metadata.
SQL statement does not return a ResultSet object.
SQL error #1: [IBM][CLI Driver][DB2] SQL0104N  An unexpected token "SCHEMANAME" was found following "".  Expected tokens may include:  ", FROM INTO".  SQLSTATE=42601

我什至尝试了reportContext.getParameterValue("SCHEMANAME") 路由,结果相同。

【问题讨论】:

    标签: sql db2 birt params


    【解决方案1】:

    ARRRGH 这是一个愚蠢的空格问题!

    " END) AS DAYOFWEEK"+ "FROM "+params["SCHEMA"]+".COBOL_CALENDAR"+

    在 FROM 前面添加一个空格修复它。

    刘海在液晶显示器上显示。

    【讨论】:

      【解决方案2】:

      看起来您编辑了报告的 XML 源。这是在 SQL 查询中替换任意字符串的更图形化方式:

      将您的查询写成如下:

      SELECT CURRENT DATE AS DATE, 
      (CASE WHEN DAYOFWEEK(CURRENT DATE) = 1 THEN 'SUNDAY'
            WHEN DAYOFWEEK(CURRENT DATE) = 2 THEN 'MONDAY'
            WHEN DAYOFWEEK(CURRENT DATE) = 3 THEN 'TUESDAY'
            WHEN DAYOFWEEK(CURRENT DATE) = 4 THEN 'WEDNESDAY'
            WHEN DAYOFWEEK(CURRENT DATE) = 5 THEN 'THURSDAY'
            WHEN DAYOFWEEK(CURRENT DATE) = 6 THEN 'FRIDAY'
            WHEN DAYOFWEEK(CURRENT DATE) = 7 THEN 'SATURDAY'
            END) AS DAYOFWEEK
      FROM dev.COBOL_CALENDAR
       WHERE SERVICE_DATE = CURRENT DATE
      

      如果dev 是一个有效的架构,您现在可以选择元数据集并且仍然可以将其替换为报告参数。

      接下来单击您的数据集并选择“脚本”选项卡。在这里选择“beforeOpen”并输入替换脚本:

      this.queryText = this.queryText.replace("dev", params["SCHEMA"].value);
      

      这样,您可以在执行查询之前将查询文本中的字符串dev 替换为SCHEMA 参数的值。您可以替换您想要的每个字符串(linke **?** 来自您的问题,但首先使用有效的模式,您可以在设计阶段使用元数据集。

      【讨论】:

        猜你喜欢
        • 2020-08-28
        • 2019-10-21
        • 2013-11-14
        • 2014-02-03
        • 2019-05-21
        • 1970-01-01
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多