2011-09-21 50 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客戶端或不依賴客戶端安裝的瘦客戶端應用程序,那麼它就可以工作。