2011-04-12 82 views
4

我從來沒見過這樣...我有開始了這樣的查詢:表或視圖不存在 - 甲骨文抱怨一個逗號,而不是實際的表或視圖名稱

with q1 as 
    (select a.V_ID, a.D_ID, a.C_ID, 
       case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val, 
       a.C_val 
     from ab_a_table a 
     where a.C_ID = '00000003' -- '00000007' -- test values 
      and a.B_VAL = '6010001' 
      and a.Q = '11234567') 
select case 
      when ... /* rest of query omitted */ 

當我嘗試運行這個時,Oracle抱怨那table or view does not exist。但它突出了「」第3行,而不是實際的表/視圖名稱:

 
       case when a.percent > 0 THEN 'Y' ELSE 'N' end L_VAL, 
                    * 
ERROR at line 3: 
ORA-00942: table or view does not exist 

我省略了查詢的其餘部分是相當漫長和複雜的 - 我會消毒,如有必要將它張貼 - 現在我只是說,只有當我添加了第三個子查詢q1時纔會出現此錯誤。事實上,我似乎可以刪除3個子查詢中的任何一個,並且整個事情都會執行(儘管結果不正確),所以感覺我已經遇到了某種Oracle錯誤,而不是純粹的SQL錯誤。同樣有趣的是,我可以將q1作爲獨立查詢運行,當我這樣做時沒有問題。只有當我運行整個查詢時,它會在q1中的案例之後抱怨逗號。

有沒有人遇到過這個?

(使用Oracle 10g)。


編輯:嘗試添加AS關鍵字。現在的結果:

 
       case when a.perc_fault > 0 THEN 'Y' ELSE 'N' end AS L_VAL, a.C_VAL 
                    * 
ERROR at line 3: 
ORA-00942: table or view does not exist 

它看起來像星號是在相同的位置,但根據V因爲這個詞L_VAL已被3個字符移位。很奇怪......

+0

這是怎樣的一個長鏡頭,但嘗試改變線問題「情況下,當a.percent> 0,則‘Y’ELSE‘N’年底AS L_VAL」 - 換句話說,添加「AS」關鍵詞。 – 2011-04-12 14:25:52

+0

@Bob Jarvis:我現在在問題中添加了'AS' keywored,結果。 – FrustratedWithFormsDesigner 2011-04-12 14:28:30

+1

顯然,該錯誤不在公共表格表達式中,因此您應該發佈完整的聲明。我強烈認爲高亮簡單地指出錯誤的位置 - 無論工具,它是不突出顯示,因爲「甲骨文」不做錯誤突出 – 2011-04-12 15:45:30

回答

0

假設您遇到Oracle錯誤並且無法修補數據庫,您可以嘗試將子查詢移至某個函數。不能完全肯定這會工作,並假定你的PL/SQL版本是在一個包,或有一個可用的,可以有一個功能補充說:

在包裝規格:

type q1_rec is record(
    d_id ab_a_table.v_id%TYPE, 
    v_id ab_a_table.d_id%TYPE, 
    c_id ab_a_table.c_id%TYPE, 
    l_val char(1), 
    c_val ab_a_table.c_val%TYPE); 
type q1_arr is varray(9999); -- assuming you can pick a max size 
function q1 return q1_arr pipelined; 
pragma restrict_references(q1, wnds); 

在封裝體:

function q1 return q1_arr pipelined is 
    cursor c is 
     select a.V_ID, a.D_ID, a.C_ID, 
       case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val, 
       a.C_val 
     from ab_a_table a 
     where a.C_ID = '00000003' -- '00000007' -- test values 
      and a.B_VAL = '6010001' 
      and a.Q = '11234567'); 
begin 
    for r in c loop 
     pipe row(r); 
    end loop; 
end; 

然後在您的主查詢中用table(q1())替換子查詢。

使用引用遊標或嵌套表可能有點整齊,但需要一個在包外部構建的表類型,我想根據關於使用視圖的額外對象註釋來避免這種情況。

+0

我可能會朝這個方向走,但需要一些時間來弄清楚如何打破東西拆開... – FrustratedWithFormsDesigner 2011-04-13 13:20:28

+1

我的代碼sn't完全相同但這個想法是相似的 - 我打破了巨人查詢的子查詢分割成3個光標,然後用大約十幾行將整個東西封裝在一個函數中,以控制運行哪個查詢。這是醜陋的,但它的作品,因爲功能存在於我的腳本內我甚至不需要編譯任何包! :) – FrustratedWithFormsDesigner 2011-04-13 15:05:57

0

我不確定我是否有經驗的Oracle bug 5130732,但它確實感覺像。反正,我改寫了這樣的查詢:

select case ... 
from 
    (select ... 
    from (select a.V_ID, a.D_ID, a.C_ID, 
       case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val, 
       a.C_val 
     from ab_a_table a 
     where a.C_ID = '00000003' -- '00000007' -- test values 
      and a.B_VAL = '6010001' 
      and a.Q = '11234567') q1, <other tables> 
    where ...) subquery1, 
    (select ... 
    from (select a.V_ID, a.D_ID, a.C_ID, 
       case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val, 
       a.C_val 
     from ab_a_table a 
     where a.C_ID = '00000003' -- '00000007' -- test values 
      and a.B_VAL = '6010001' 
      and a.Q = '11234567') q1, <other tables> 
    where ...) subquery2, 
    (select ... 
    from (select a.V_ID, a.D_ID, a.C_ID, 
       case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val, 
       a.C_val 
     from ab_a_table a 
     where a.C_ID = '00000003' -- '00000007' -- test values 
      and a.B_VAL = '6010001' 
      and a.Q = '11234567') q1, <other tables> 
    where ...) subquery3, <other tables> 
where.... 

是的,我包括了q1在使用它的每一個子查詢的副本,現在一切工作正常。真正的觀點也可以發揮作用,但這樣做更容易(政治上,也就是說 - 不需要向需要進行分析的環境提供代碼提升請求,也不需要關於數據庫中後期添加的對象的會議等)。


UPDATE

而現在,我已經添加了查詢到我的PL/SQL腳本,甲骨文給我ORA-00600 [qcscpqbTxt], [600],這似乎是Oracle相關的bug#5765958 .... *嘆息* ...任何人都可以提出一個解決方法?我沒有metalink訪問權限(好吧,我可以通過DBA,如果這能以某種方式進入他們的雷達)。

+1

你的DBA可能。已經知道ORA-600將在警報日誌中。 5765968似乎是指ANSI連接和/或綁定變量;猜測你的PL/SQL版本將會有變量而不是硬編碼的值。也有參考5532110,但不能看到任何細節。無法看到提及的解決方法。目前還不清楚它是否仍然是導致問題的子查詢,但似乎我猜可能。如果只是希望優化器不會太聰明,我可能還會考慮一個本地函數返回PL/SQL中的引用遊標。你也嘗試過這裏的提示嗎? – 2011-04-12 22:03:07

+0

@Alex Poole:今天早些時候,DBA向我發送了錯誤的跟蹤文件。他說他可能會開始聯繫甲骨文,但我會嘗試使用代碼混合查詢來首先將事情分開。 – FrustratedWithFormsDesigner 2011-04-13 13:19:56

相關問題