Oracle DB的SSRS报告 - 使用存储过程

时间:2009-07-06 23:39:04

标签: sql oracle stored-procedures reporting-services subreport

我正在Sql Server Reporting Services 2005中开发一个报告,连接到Oracle 11g数据库。当您发布回复时,或许有助于了解我熟练掌握MSSQL Server并且缺乏Oracle经验。

我有多个嵌套的子报表,需要在外部报表中使用摘要数据和相同的数据,但在内部报表中有详细说明。为了避免DB服务器多次执行,我想在开头填充一些临时表,然后在报告和子报告中多次查询它们。

在SSRS中,数据集显然按它们在RDL文件中出现的顺序执行。并且您可以拥有不返回行集的数据集。所以我创建了一个存储过程来填充我的四个临时表,并使其成为我报告中的第一个数据集。当我从SQLDeveloper运行它时,此SP可以工作,我可以查询临时表中的数据。但是,这似乎没有成功,因为SSRS显然没有重用相同的会话,所以即使全局临时表是使用ON COMMIT PRESERVE ROWS创建的,我的数据集也是空的。

我切换到使用“真实”表,现在传入一个额外的参数,一个字符串形式的GUID,在每次新执行时唯一生成,这是每个表的主键的一部分,所以我可以回来这次执行的行。

从Sql Developer运行它可以正常工作,例如:

DECLARE
ActivityCode varchar2(15) := '1208-0916      ';
ExecutionID varchar2(32) := SYS_GUID();
BEGIN
CIPProjectBudget (ActivityCode, ExecutionID);
END;

不要紧,在这个例子中我不知道GUID,这只是证明它有效,因为行被插入到我的四个表中。

但是在SSRS报告中,我的数据集中仍然没有行,SQL Developer确认没有插入任何行。

所以我想的是:

  • Oracle使用隐式事务,我的更改未提交?
  • 即使我可以证明非行集返回SP正在执行(因为如果我省略了参数映射,它会在报告呈现时抱怨没有足够的参数)也许它不是真正执行。不知。
  • 错误的执行顺序不是问题或行会出现在表中,而不是。

我对如何实现这一点的任何想法感兴趣(特别是关于不多次运行主要查询的部分)。我会重新设计我的整个报告。我将停止使用存储过程。建议你喜欢的任何东西!我只是需要帮助让这个工作,我被卡住了。

如果你想要更多的细节,在我的SSRS报告中,我有一个List对象(它是一个容器,对数据集中的每一行重复一次),它有一些标题值,然后包含一个子报告。最终,将有四个总报告:一个主报告,三个嵌套子报告。每个子报告都将位于父报告的列表中。

1 个答案:

答案 0 :(得分:2)

叹息。

在SP中选择的列具有char数据类型,但SP具有varchar2输入参数。在Oracle中,varchar2变量实际上丢失了它们的尾随空格(与SQL Server不同)。最重要的是,我正在从数据库查询的SSRS参数上做RTrim()。

对于那些可能想知道的人... Oracle中的SP无法返回行集。因此,如果您从SSRS运行SP,则可能是填充表格。但SSRS默认情况下通常同时运行查询。要使其以串行方式运行查询,请编辑运行SP的数据集,单击“数据源”下拉列表旁边的“...”按钮,然后选中底部的“使用单个事务”复选框。只要SP是RDL文件中列出的第一个数据集,它应首先运行,其他数据集等待它完成。注意:此设置适用于使用相同数据源的所有数据集。