Oracle WITH Clause导致SSRS问题?

时间:2012-03-13 20:14:43

标签: oracle oracle10g reporting-services oracle-sqldeveloper

我正在使用SSRS(2k5)来报告来自oracle的数据。该报告的目的是对数据进行大约100次检查(完成后)以查看是否输入正确(并且我们的软件按照预期的方式运行)。为了实现这一点,我创建了一个包含和管道功能的实现WITH子句。大致上在Oracle中构建的包看起来像这样:

WITH A as (select stuff from X), B as (select stuff from Y join X), C as (select stuff from Z join X)
Subquery1
Union
Subquery2
Union
...
Subquery100

我使用Table()直接从SSRS调用此包函数。一切都很好。但是,如果我在当天晚些时候运行它,我会收到一条错误消息:

  

ORA-32036:不支持在WITH子句ORA-6512中内联查询名称的情况:在“[function name]”

但是,如果我打开Oracle SQLDeveloper并运行该函数然后返回到SSRS,那么everthing运行正常(一段时间)。

我意识到它可能对我的嵌套WITH子句感到生气,但是什么会导致它工作一段时间,然后很快失败?请注意,它始终适用于SQLDeveloper
在此先感谢您的帮助!

5 个答案:

答案 0 :(得分:4)

您的问题是您使用(在SSRS内部)连接到Oracle的客户端版本(或可能是客户端中的驱动程序)可能不支持WITH子句中的函数调用。

在9i客户端中,WITH子句没有完全正常运行,我怀疑哪个客户端连接到Oracle(即使它不是9i客户端)仍然没有完全正常运行。

你必须要么:

1)升级SSRS内的Oracle客户端(或驱动程序)(如果可能的话) 2)升级您的SSRS版本(如果它不是最新版本,但请检查是否值得先进行升级)
3)重新编写没有WITH子句的查询,而是使用内联视图。

另一个选择是创建所需数据的数据库视图,并在select语句中引用它们,这不是理想的,但可能是一个选项。

希望它有所帮助...

答案 1 :(得分:3)

我遇到了同样的问题,并通过将pragma autonomous_transaction;添加到函数..e.g:

来解决它
create or replace function myfunction()  return varchar2 is pragma autonomous_transaction;
begin
--Your code here
commit;---> don't forget the commit or else won't work
return 'result'
end; 

如果你的功能没有用数据操作,请使用它。

答案 2 :(得分:1)

也许杰夫早先暗示了这一点,但是我确实通过使用OPENQUERY()来包含oracle查询来实现这一点。
奇怪的是,我仍然需要在所有更改工作后运行一次查询才能工作,但在我需要运行报告之前,我不再需要运行它。再次感谢您的帮助!

答案 3 :(得分:0)

我使用的是其他商务智能工具但得到了同样的错误。通过将DistribTx = 0添加到连接字符串,找到了一个对我有用的好解决方案。感谢Sean对这篇文章的评论 https://orastory.wordpress.com/2007/09/20/one-of-those-weird-ones-ora-32036/#comment-9164

从11g r2开始,Oracle仍未解决该问题

答案 4 :(得分:0)

在SSRS中,我使用Oracle驱动程序直接连接到Oracle 10g数据库。我发现这个驱动程序有以下限制:

  1. 在查询中不能多次引用单个WITH子查询,即使SQL Developer允许您“欺骗”#34;并侥幸逃脱。

  2. 如果我尝试在SSRS中执行超过两个 WITH子查询的查询,即WITH A AS (...), B AS (...) SELECT ... FROM A, B ...,我将收到错误ORA-32036,即使在SQL Developer我可以使用尽可能多的WITH

  3. 所以另一个建议是尝试重写您的查询以使用不超过两个WITH子查询。