首页 > 解决方案 > 如何在 Oracle Report 公式列的绑定变量中传递多个字符串?

问题描述

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

Select * from CEP_TABLE where Table_ID in (:P_IDLIST) 

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

如果我将参数定义为字符,它会接受该参数,但随后数据库会给出“无效数字”错误。看来它正在用引号中的整个参数替换绑定变量 - 例如

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

但我想要它没有引号:

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

如果我定义多个参数,我可以让报告工作——例如 Table_ID in (:P1,:P2,:P3,:P4) 但他们可能有一百个他们想要包含的项目,所以定义 100 个参数似乎很疯狂——并且真的……我不想要任何限制。

以前有人解决过这个问题吗?——这似乎很常见。我可以让页面将选定的 ID 写入某个临时表,然后定义查询以加入该表,但这似乎也太过分了。

标签: oracleoraclereports

解决方案


有一个英雄来救援,他的名字是词法参数

您说您的查询如下所示:

select * 
from CEP_TABLE 
where Table_ID in (:P_IDLIST) 

报告已包含名为 的参数p_idlist。现在手动创建另一个;让我们称之为lex_idlist。它的数据类型应该是character,它的长度比p_idlist参数的长一些(例如, if p_idlistis character(50), make 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子句,将其存储到词法参数中,然后该词法参数将“行动”,就好像它是一个真实的 WHERE子句一样。

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


推荐阅读