如何在Oracle Report公式列的绑定变量中传递多个字符串?

时间:2018-10-02 11:05:41

标签: oracle oraclereports

我们有一个页面显示一个记录列表,并且允许用户检查所需的行,然后获取打印这些选定记录的报告。我正在尝试将Oracle Report定义为具有单个参数,该参数将是要打印的ID的逗号分隔列表。但是,它不起作用。 SQL是这样的:

Select * from CEP_TABLE where Table_ID in (:P_IDLIST) 

如果我将参数定义为数字,则在尝试给它654655时会收到“无效的参数输入”错误-它不喜欢使用逗号。

如果我将参数定义为字符,则它将接受该参数,但是数据库会给出“无效数字”错误。似乎是用整个参数用引号将绑定变量代替–例如。

Select * from CEP_TABLE where Table_ID in (‘654,655’)

但我希望它不带引号:

Select * from CEP_TABLE where Table_ID in (654,655)

如果我定义了多个参数,例如,我可以使报表生效。 (_:P1,:P2,:P3,:P4)中的Table_ID,但他们可能要包含一百个项目,因此定义100个参数似乎很疯狂–实际上……我不希望有任何限制。

有人解决过这个问题吗? –似乎很普遍。我可以让页面将选定的ID写出到某个临时表中,然后定义要加入该表的查询,但这似乎也过多。

2 个答案:

答案 0 :(得分:1)

有一个英雄要解救,他的名字是 lexical parameter

您说您的查询如下:

select * 
from CEP_TABLE 
where Table_ID in (:P_IDLIST) 

报告已包含名为p_idlist的参数。现在,手动创建另一个。我们称之为lex_idlist。其数据类型应为character,其长度应比p_idlist参数的长度大一些(例如,如果p_idlistcharacter(50),则使lex_idlist character(70)

然后重写查询,如下所示:

select *
from cep_table
&lex_idlist

转到After Parameter Form触发器,其外观应如下所示:

function AfterPForm return boolean is
begin
  :lex_idlist := 'where table_id in (' || :p_idlist || ')';
  return (TRUE);
end;

仅此而已-编译报告并运行它。在p_idlist参数中输入一些值(例如654,655)。触发器将动态动态创建WHERE子句,并将其存储到词法参数中,然后将其“执行”,就好像它是 real WHERE条款。

在在线报表帮助系统中阅读有关词法参数的更多信息。

答案 1 :(得分:0)

这是一个非常普遍且不平凡的问题。

您需要将单个输入字符串分成其组件标记。由于没有您的表格,因此我将说明如何在标准emp模式的scott表格上完成此操作;您可以通过以下方法获取用逗号分隔的单个字符串(例如'10,30')中给出的部门编号列表的行:

select * from scott.emp
where  deptno in 
    (select to_number(regexp_substr(:p_deptno, '\d+', 1, level)) from dual
       connect by level <= regexp_count(:p_deptno, '\d+')
    )
;

公平地说,还有一些方法不会拆分字符串,而是通过字符串比较玩一些愚蠢的游戏;但这将是非常无效的-例如,它们不允许您使用在table_id(或在我的示例中的deptno上)上拥有的索引。