【问题标题】:SSRS Report from Oracle DB - Use stored procedure来自 Oracle DB 的 SSRS 报告 - 使用存储过程
【发布时间】:2010-11-08 13:10:37
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    叹息。

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

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

    【讨论】:

    • 您应该将评论的内容放入您的答案中,以便人们更容易找到它(这样您就可以获得更多代表!)。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多