0

我试图在 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 Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for Solaris:版本 10.2.0.4.0 - Production
NLSRTL 版本 10.2.0.4.0 - 生产

可能是权限问题还是什么?

*编辑:*

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

编辑 2

好的,所以如果我尝试从 SQL Server Management Studio 的链接服务器执行查询,我会收到一些错误信息:

sg 7357, Level 16, State 2, Line 1 无法处理对象“with test as (select count(*) from v$version) select * from test;”。链接服务器“MyServer”的 OLE DB 提供程序“MSDAORA”指示该对象没有列或当前用户对该对象没有权限。

4

5 回答 5

1

尝试给聚合一个别名。

with test as 
 (select count(*) as MyCount 
 from my_table)
select MyCount
from test;
于 2011-09-21T20:58:28.230 回答
1

以下对我来说很好(10gR2)

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

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

SQL> 

你用的是什么客户端?

于 2011-09-21T21:58:30.573 回答
1

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

  • grant query rewrite to youruser;
  • grant create materialized view to youruser;
于 2011-09-22T00:34:44.273 回答
0

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

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

它类似于写作:

select * from (select count(*) from my_table);

于 2011-09-21T21:01:50.587 回答
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 developer 或 SQL*Plus)的简单示例,则会出现错误。如果您使用 Oracle 12 客户端或不依赖客户端安装的瘦客户端应用程序,那么它可以工作。

于 2016-02-26T17:12:03.637 回答