2016-06-07 72 views
3

我有一個Oracle錯誤(ORA-01008):事情是這個錯誤第一次出現,沒有修改table/Schema(但是有數據庫升級)。 我試過立即執行,但我仍然得到相同的錯誤。ORA-01008:數據庫升級後並非所有變量綁定

SET serveroutput ON; 
set define off; 
--alter session set "_subquery_pruning_enabled"=false; 
DECLARE 
    z_value NUMBER  := -1; 
    CURSOR listedocument 
    IS 
    select to_number(2310458) as coco from dual; 
BEGIN 
    FOR l IN listedocument 
    LOOP 
    BEGIN 
      dbms_output.put_line (' l.coco= ' || l.coco); 
     SELECT oa.myvalue 
      INTO z_value 
      FROM schema2.table2 oa 
       INNER JOIN 
        schema1.table1 ed 
       ON ed.coco = oa.coco 
      WHERE ed.coco = l.coco 
     ; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     dbms_output.put_line ('NO_DATA_FOUND'); 
    WHEN OTHERS THEN 
     dbms_output.put_line ('Exception de traitement ' || SQLERRM); 
    END; 
    END LOOP; 
END; 

這個問題似乎在這裏WHERE ed.coco = l.coco 我得到的錯誤:異常去TRAITEMENT ORA-01008:未綁定 [==>後修改的消息]

我所有變量得到的錯誤:ORA-01008:並非所有的變量綁定

當我使用alter session set "_subquery_pruning_enabled"=false;一切wor ks,但表現糟糕。

我正在使用Oracle數據庫11g(11.2.0.4.0)。

+1

解決我假設你在談論「ORA-01008:未綁定的所有變量」。請不要通過將法語翻譯成英語來發明新的錯誤信息 - 將ORA-01008放入您最喜愛的搜索引擎中將返回正確的英文字詞。另外,我會對你有什麼想法使用非文件化的'_subquery_pruning_enabled'參數感興趣 - 這是從Metalink中獲取的嗎? –

+0

我不能看到在這種情況下使用任何綁定變量。 –

+0

你可以嘗試禁用動態採樣並嘗試。我認爲這可能會有所幫助。 alter session set optimizer_dynamic_sampling = 0 –

回答

1

看起來你可能碰到了一個錯誤。 請看: https://community.oracle.com/thread/3894065?start=30&tstart=0

在有些情況下優化呼叫kkpap在編譯時做分區
修剪的情況。有時,分區修剪通過
對該表運行子查詢完成。如果運行這些子查詢所需的綁定變量值爲
,那麼我們不能在編譯時執行修剪
。 錯誤14458214的修復程序解決了此問題,即子查詢用於在分區級別修剪的情況。但是,它是
可能我們在分區級別使用其他方法,然後在子分區級別使用 子查詢修剪;這種情況下,並沒有
由修爲14458214.

+0

的確,這就是我找到'_subquery_pruning_enabled'解決方案的地方。但它似乎會降低性能。另一種解決方案是將'to_number'應用於** ed.coco **,如'to_number(ed.coco)= 1。可可',但表現很糟糕,我無法解釋原來的問題。 – FTK

+1

如果你有訪問oracle的支持,你應該安裝補丁(如果有的話)或與他們聯繫恕我直言 – vercelli

+1

不,我不知道,我不是DBA。但是我做了一些測試:首先,我的要求適用於其他環境。然後'schema2.table2'是一個基於DBLINK的物化視圖,我使用了另一個物化視圖(基於相同的DBLINK),它使用了相同的約束(oa.coco)。在用'table2 @ DBLINK'更改'schema2.table2'後,它就可以工作。所以我認爲這個具體視圖存在一個問題,但我不是專家來確定它是什麼(分區等)...... – FTK

0
DECLARE 

    z_value NUMBER  := -1; 


coco number; 
BEGIN 
    BEGIN 
coco:=2310458; 
      dbms_output.put_line (' coco= ' || coco); 
     SELECT oa.myvalue 
      INTO z_value 
      FROM schema2.table2 oa 
       INNER JOIN 
        schema1.table1 ed 
       ON ed.coco = oa.coco 
      WHERE ed.coco = coco 
     ; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     dbms_output.put_line ('NO_DATA_FOUND'); 
    WHEN OTHERS THEN 
     dbms_output.put_line ('Exception de traitement ' || SQLERRM); 
    END; 

當你在遊標中有1個變量時使用LOOP ...不是一個好主意。

+1

這並沒有回答這個問題。此外,使用循環遍歷1(或0)行非常好(儘管很少需要)。 –

+0

我選擇了一個變量來簡化我的光標。但實際上,光標獲得多個值。 – FTK