2012-05-29 51 views
0

我有一個正在執行動態選擇查詢的存儲過程。查詢字符串很大。以下是當運行該SP它顯示以下錯誤無法在存儲過程中運行大型動態選擇查詢

ORA-00600: internal error code, arguments: [qcscbAddToSelLists], [], [], [], [], [], [], [], [], [], [], []

所以減少dynSqlComplete變量的大小爲VARCHAR2(5000)中,然後運行該存儲過程所存儲的過程

 

create or replace 
procedure My_SP 
(
procRefCursor out sys_refcursor, 
--My other input variables here 
) 
is 

dynSqlComplete varchar2(8000) := 'n/a'; 

begin 

    dynSqlComplete := 'Large query here'; 

    open procRefCursor for dynSqlComplete; 

end; 

。我得到了以下錯誤:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

我曾妄圖很多事情,我也不想他們在這裏補充,因爲它會誤導。

- 編輯 - 2012年6月6日

大家好,

我能夠針點的問題,但我還沒有能夠解決這個問題。我試圖按部分運行查詢部分,並且發現拋出錯誤的查詢。它包含START WITH,當我評論它時,查詢開始工作。我已經給出了下面的代碼並將錯誤代碼註釋掉了。

 

     SELECT RowNum AS RowNumber1, 
     GR.*, 
     --LEVEL AS LineageLvl, 
     VDE.* 
    FROM 
     (SELECT * 
     FROM group_relations left outer join relation_classifier_instances RC on 
     rc.relation_id = group_relations.Group_relation_id WHERE group_relation_type_id IN 
     (19,20,32,38,42,43) and (rc.relation_id is null) 
    ) GR 
    LEFT OUTER JOIN Vendor_Feed_data_elements VDE 
    ON GR.Group_Relation_Type_Id = 19 
    AND GR.Primary_GroupField_Id = VDE.Vendor_Data_Element_Id 
     /* Code which is giving the error 
     START WITH 
     (
     VDE.Vendor_Data_Element_Id IS NOT NULL ) 
     CONNECT BY nocycle prior GR.RELATED_GROUPFIELD_ID = GR.PRIMARY_GROUPFIELD_ID*/ 

+1

什麼你的DBA說什麼?相當肯定的是,ora 600可能需要Oracle支持才能實現。 – tbone

+1

如果在打開遊標之前打印您生成的SQL語句(即,'dbms_output.put_line(dynSqlComplete)',然後嘗試手動執行該語句,該語句是否工作?如果是這樣,那麼您已經縮小了問題的範圍如果沒有,問題出在SQL語句本身或你生成的SQL語句格式錯誤 –

+0

@Justin,我試過dbms_output.put_line(dynSqlComplete),其實我試過dbms_output .put_line('hi')只是在分配大查詢之前,但它不顯示,我認爲它只是在失敗之前,但是當我減小varchar2大小然後執行時,它顯示「hi」,然後字符串緩衝區錯誤即將到來 – samar

回答

0

您可以嘗試使用一個CLOB在11g的一個CLOB,像(未經測試):

declare 
    l_sql clob; 
    l_str1 varchar2(32767); 
    l_str2 varchar2(32767); 
begin 
    dbms_lob.createtemporary(l_sql, false); 

    l_str1 := 'some large SQL chunk'; 
    l_str2 := 'and the rest of large SQL chunk'; 

    l_sql := l_str1; 
    dbms_lob.writeappend(l_sql, length(l_str2), l_str2); 

    execute immediate l_sql; 

    dbms_lob.freetemporary(l_sql); 

end; 
+0

不行,立即執行需要varchar2,clob導致'PLS-00382:表達式類型錯誤'。 –

+0

除非在10gR2和11g之間有所變化。 –

+0

@tbone,會給它一個鏡頭,讓我們。謝謝。 – samar

-1

確定你不想要一個函數?這裏有一個我做得很相似的例子。

FUNCTION showbody(cust varchar2, receipt varchar2) 
    RETURN sys_refcursor AS retval sys_refcursor; 
BEGIN 
    OPEN retval FOR 
     SELECT * 
     FROM comp.comp_remittance_details 
     WHERE receipt_number=receipt 
      AND customer_number=cust; 
    RETURN(retval); 
END showbody; 
+0

爲什麼-1? - 請 – SQLMason