2011-09-21 48 views
0

我想在Oracle中使用WITH子句,但它没有返回任何数据。Oracle WITH子句返回没有数据

这是我试图运行查询...

with test as 
(select count(*) 
from my_table) 
select * 
from test; 

当我运行这段代码,我回来的记录计数MY_TABLE

select count(*) 
from my_table 

我在甲骨文10克因此查询应该工作...

select * from v$version; 

产生

Oracle数据库10g企业版发布10.2.0.4.0 - 64bi
PL/SQL发布10.2.0.4.0 - 生产
CORE 10.2.0.4.0生产
TNS用于Solaris:10.2.0.4版本。 0 - 生产
NLSRTL版10.2.0.4.0 - 生产

莫非权限问题还是什么?

* 编辑:*

我相信我的问题是清楚的。即使WITH语句中的“my_table”语句中的“select count(*)”正常工作,使用WITH语句也不会返回任何记录,这会导致我相信还有另一个问题无法解决,因此,这个问题:)

EDIT 2

好了,如果我尝试从SQL Server Management Studio中的链接服务器执行查询,我得到了一些错误信息反馈:

SG 7357 ,等级16,状态2,行1 无法处理对象“测试为 (select count(*) from v $ version) select * from test;“。链接服务器“MyServer”的OLE DB提供程序“MSDAORA”表示该对象没有列或当前用户没有该对象的权限。

+1

作为一个实验,将单词test重命名为xyz123 – EvilTeach

+0

请说明一下您的问题。看起来像DCookie提供了下面的工作示例。即使my_table有零记录,你也应该得到1行1列的结果'0' –

+0

这听起来像PL/SQL Developer做错了什么。当你从SQL * Plus运行时,你会得到相同的“结果”吗? –

回答

1

也许优化器正在实现计数查询(哑,我同意)。这是黑暗中的一击,但你有这些特权吗?

  • grant query rewrite to youruser;
  • grant create materialized view to youruser;
+0

我不能授予任何privelages,我甚至不知道我可以查看我的privelages究竟是什么。我在一个虚拟IT部门,因此我公司的DBA不想帮助我。 – ChandlerPelhams

+0

看起来这是一个有关物化视图的privelages问题。 – ChandlerPelhams

1

尝试给出聚合的别名。

with test as 
(select count(*) as MyCount 
from my_table) 
select MyCount 
from test; 
+0

不幸的是,这也不起作用... – ChandlerPelhams

0

这个问题令人困惑。你是说你还是不是从my_table中取回计数?

您应该重新计数,因为这正是您在with子句中所要求的。

它类似于写作:

SELECT * 从(从MY_TABLE SELECT COUNT(*));

1

SQL> with test as 
    2 (select count(*) 
    3 from user_tables) 
    4 select * 
    5 from test; 

    COUNT(*) 
---------- 
     593 

SQL> 

什么是您使用的客户端工作得很好,我(10gR2中)?

+0

我使用PL/SQL Developer v 7.0.3.1123 – ChandlerPelhams

+0

我有PL/SQL Developer v9.0.1,它在那里工作。你可以在SQL * Plus中试用吗? – DCookie

0

有人在我的公司就遇到了这个有一天 - 我们跟踪下来的Oracle客户端版本[因而OCI.DLL]版本那被PL/SQL开发人员挑选出来。我们的一些开发人员的电脑上安装了Oracle 8(!)客户端,并且还安装了更新的版本。

症状是,不仅查询使用WITH子句写入没有返回行,他们也没有返回任何列!如果你手动设置应用程序来选择Oracle 11 oci.dll,那么它一切正常。

我认为发生的事情是Oracle 8早于WITH子句(在Oracle 9中引入,随后得到增强)。现在,大多数情况下,您可以获得不同版本的Oracle客户端和服务器以相互交谈。然而,由于客户端具有一定数量的“智能”,因此它应该半知道它正在向数据库提交什么样的操作,并且对SQL的某种形式的原始解析也是如此。由于它不能将该命令识别为SELECT,因此将其视为某种未知命令[例如可能是一个DDL命令]并且不会将其识别为返回结果集。如果您打开会话的SQL_TRACE,您可以看到SQL在服务器上获得了PARSEd和EXECUTEd,但没有调用FETCH。

我最近在尝试使用Oracle 12中允许内联函数定义的新WITH语法的时候自己也有类似的东西。如果您尝试使用基于Oracle 11胖客户端的应用程序(例如PL/SQL开发人员或SQL * Plus)的简单示例,则会出现错误。如果您使用Oracle 12客户端或不依赖客户端安装的瘦客户端应用程序,那么它就可以工作。