我们有一个页面显示一个记录列表,并且允许用户检查所需的行,然后获取打印这些选定记录的报告。我正在尝试将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写出到某个临时表中,然后定义要加入该表的查询,但这似乎也过多。
答案 0 :(得分:1)
有一个英雄要解救,他的名字是 lexical parameter 。
您说您的查询如下:
select *
from CEP_TABLE
where Table_ID in (:P_IDLIST)
报告已包含名为p_idlist
的参数。现在,手动创建另一个。我们称之为lex_idlist
。其数据类型应为character
,其长度应比p_idlist
参数的长度大一些(例如,如果p_idlist
为character(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
上)上拥有的索引。