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