5

我正在 Sql Server Reporting Services 2005 中开发一个报表,连接到一个 Oracle 11g 数据库。当您发布回复时,知道我精通 MSSQL Server 而缺乏 Oracle 经验可能会有所帮助。

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

在 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 对象(它是一个对数据集中的每一行重复一次的容器),它具有一些标题值,然后包含一个子报告。最终,总共会有四个报表:一个主报表,三个嵌套的子报表。每个子报表都将在父报表的列表中。

4

1 回答 1

3

叹。

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

对于那些可能想知道的人... Oracle 中的 SP 不能返回行集。因此,如果您从 SSRS 运行 SP,则可能是为了填充表。但默认情况下,SSRS 通常会同时运行查询。要使其串行运行查询,以便以后的查询可以正确地依赖于较早的查询的结果,请编辑运行 SP 的数据集,单击“数据源”下拉列表旁边的“...”按钮,然后检查底部的“使用单笔交易”复选框。只要 SP 是 RDL 文件中列出的第一个数据集,它就应该首先运行,其他数据集将等到它完成运行。注意:此设置适用于使用相同数据源的所有数据集。

于 2009-07-06T23:56:05.957 回答