我正在尝试在Oracle中使用WITH子句,但它没有返回任何数据。
这是我试图运行的查询...
with test as
(select count(*)
from my_table)
select *
from test;
当我运行此代码时,我会回到my_table
中的记录计数select count(*)
from my_table
我在Oracle 10g上,所以查询应该有效......
select * from v$version;
产量
Oracle数据库10g企业版10.2.0.4.0版 - 64bi
PL / SQL版本10.2.0.4.0 - 生产
核心10.2.0.4.0生产
TNS for Solaris:版本10.2.0.4.0 - 生产
NLSRTL版本10.2.0.4.0 - 生产
可能是权限问题还是什么?
* 编辑:*
我相信我的问题很明确。即使WITH语句中的“select count(*)from my_table”语句正常工作,使用WITH语句也不会为我返回任何记录,这会让我相信还有另一个问题,我无法弄清楚因此这个问题:)
编辑2
好的,所以如果我尝试从SQL Server管理工作室从链接服务器执行查询,我会收到一些错误信息:
sg 7357,Level 16,State 2,Line 1 无法处理对象“与测试为 (选择计数(*) 来自v $版本) select * from test;“。链接服务器”MyServer“的OLE DB提供程序”MSDAORA“表示该对象没有列,或者当前用户没有该对象的权限。
答案 0 :(得分:1)
尝试为聚合提供别名。
with test as
(select count(*) as MyCount
from my_table)
select MyCount
from test;
答案 1 :(得分:1)
以下对我来说效果很好(10gR2)
SQL> with test as
2 (select count(*)
3 from user_tables)
4 select *
5 from test;
COUNT(*)
----------
593
SQL>
您使用的是哪个客户?
答案 2 :(得分:1)
也许优化器正在实现计数查询(愚蠢,我同意)。这是黑暗中的一枪,但你有这些特权吗?
grant query rewrite to youruser;
grant create materialized view to youruser;
答案 3 :(得分:0)
这个问题令人困惑。你是说你 或不从my_table取回计数?
你应该收回计数,因为这正是你在with子句中要求的。
这类似于写作:
选择* from(从my_table中选择count(*));
答案 4 :(得分:0)
我公司的一些人前几天遇到了这个问题 - 我们将其追溯到PL / SQL开发人员正在接收的 Oracle客户端版本[以及OCI.dll]版本 。我们的一些开发人员PC已经安装了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客户端或不依赖客户端安装的瘦客户端应用程序,那么它可以正常运行。