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 リリース 10.2.0.4.0 - 64bi
PL/SQL リリース 10.2.0.4.0 - プロダクション
CORE 10.2.0.4.0
Solaris 用プロダクション TNS: バージョン 10.2.0.4.0 - プロダクション
NLSRTL バージョン 10.2.0.4.0 - 製造

権限の問題か何かでしょうか?

*編集: *

私の質問は明確だと思います。WITH ステートメントを使用しても、WITH ステートメント内の "select count(*) from my_table" ステートメントが正しく機能しているにもかかわらず、レコードが返されません。 、したがって、この質問:)

編集2

では、SQL サーバー管理スタジオからリンク サーバーからクエリを実行しようとすると、エラー情報が返されます。

sg 7357、レベル 16、状態 2、行 1 「with test as (select count(*) from v$version) select * from test;」というオブジェクトを処理できません。リンク サーバー "MyServer" の OLE DB プロバイダ "MSDAORA" は、オブジェクトに列がないか、現在のユーザーがそのオブジェクトに対するアクセス許可を持っていないことを示しています。

4

5 に答える 5

1

たぶん、オプティマイザーがカウントクエリを具体化しています(ばかげています、私は同意します)。これは暗闇でのショットですが、これらの特権はありますか?

  • grant query rewrite to youruser;
  • grant create materialized view to youruser;
于 2011-09-22T00:34:44.273 に答える
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 に答える
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 が正しく PARSE および EXECUTE されていることがわかりますが、FETCH の呼び出しは行われていません。

最近、インライン関数定義を許可する Oracle 12 の新しい WITH 構文を使用しようとしたときに、同様のことがありました。PL/SQL 開発者や SQL*Plus などの Oracle 11 シック クライアント ベースのアプリケーションを使用して簡単な例を試すと、エラーが発生します。Oracle 12 クライアント、またはクライアント側のインストールに依存しないシンクライアント アプリケーションを使用している場合、それは機能します。

于 2016-02-26T17:12:03.637 に答える