2011-09-21 6 views
0

OracleではWITH句を使用しようとしていますが、データは返されません。Oracle WITH句はデータを返しません

これは私がこのコードを実行すると、私はオラクルの午前MY_TABLE

select count(*) 
from my_table 

内のレコードの数を取り戻す...

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

私が実行しようとしていますクエリです10グラムの問合せは...

select * from v$version; 

利回り

を動作するはずですので、

たOracle Database 10g Enterprise Editionのリリース10.2.0.4.0 - 64bi
PL/SQLリリース10.2.0.4.0 - Solaris用の生産
CORE 10.2.0.4.0生産
TNS:バージョン10.2.0.4。 0 - 生産
NLSRTLバージョン10.2.0.4.0 - 生産

そのアクセス許可の問題か何かだろうか?

* EDIT:*

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

EDIT 2

OK、私は試してみて、SQLサーバー管理スタジオからリンクサーバーからのクエリを実行した場合、私は戻っていくつかのエラー情報を取得するよう:

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

+1

をテストの名前に変更してください。xyz123 – EvilTeach

+0

質問を明確にしてください。 DCookieが以下の動作例を提供するように見えます。たとえmy_tableにレコードがない場合でも、1行1列の結果に '0'と表示されます。 –

+0

これはPL/SQL Developerのように間違っています。 SQL * PlusからSQL * Plusを実行すると、同じ結果が得られますか? –

答えて

1

おそらく、オプティマイザがカウントクエリを実現しているのでしょうか(私は同意します)。暗闇の中でのショットですが、あなたはこれらの特権を持っていますか?

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

私はprivelagesを与えることはできません、私は私のprivelagesが何であるかを正確に見ることができるとは確信していません。私はPsuedo-IT部門にいるので、私の会社のDBAは私を助けたくありません。 – ChandlerPelhams

+0

マテリアライズド・ビューに関連する重要な問題であると思われます。 – ChandlerPelhams

1

エイリアス名を集約してみてください。

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

残念ながら、これはどちらでも動作しません。 – ChandlerPelhams

0

この質問は混乱します。 またはであると言っていますか? my_tableからカウントを戻していませんか?

これは、あなたがwith節で求めたものなので、カウントを戻す必要があります。

それは書き込みに似ています:

(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デベロッパーがピックアップしていました。私たちのdev 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構文を使用しようとしたとき、私は最近同じようなことをしていました。 PL/SQL開発者やSQL * PlusなどのOracle 11 Thickクライアント・ベースのアプリケーションを使用して簡単な例を試すと、エラーが発生します。 Oracle 12クライアント、またはクライアント側のインストールに依存しないシンクライアントアプリケーションを使用する場合、動作します。

関連する問題