2014-02-10 30 views
0

我正在使用oracle 11g。每當我遇到大於varchar2大小限制的字符串時,我在sql server中使用將數據拆分爲如下的多個變量,然後在執行時加入它們。不過,甲骨文似乎預計在執行前會有32K的組合大小。我得到「ORA-20000:ORU-10028:行長度溢出,每行32767字節的限制」錯誤。Oracle - 如何處理變量中的32K +字符串長度

我在oralce腳本中使用這些變量(不是存儲過程)。最後2條語句拋出上述錯誤,並單獨顯示該值。 在此先感謝。

DECLARE 

sViewQuery varchar2(32000); 
sViewSelectQuery varchar2(32000); 

BEGIN 

    ---Assign values of 32,000 letter string (dynamic query) 
    sViewSelectQuery:='32K string...'; 
    sViewQuery:='32K string..'; 

    DBMS_OUTPUT.PUT_LINE(sViewQuery||sViewSelectQuery); 

    EXECUTE IMMEDIATE sViewQuery||sViewSelectQuery; 

END; 
+0

你試過CLOB? – Annjawn

+0

即使使用'clob',你也不能直接分配超過32k,你需要通過將所有部分附加到一個變量中來建立clob值。你不能連接(因爲這會產生'varchar2',並且會太大),或者在整個事情上使用'dbms_output'。我認爲,這就是拋出當前錯誤的原因,但是如果它立即執行,立即執行。 –

+0

使用clob。請參閱[這裏](http://stackoverflow.com/questions/10803095/not-able-to-run-large-dynamic-select-query-in-stored-procedure/10803440#10803440)舉例 – tbone

回答

3

可以使用DBMS_SQL包此:

DECLARE 
stmt DBMS_SQL.VARCHAR2A; 
c number; 
res number; 
BEGIN 
stmt(1) := 'create view view_a ('; 
stmt(2) := 'col_a, '; 
stmt(3) := 'col_b, '; 
stmt(4) := 'col_c) as ' 
stmt(5) := 'select '; 
stmt(6) := 'col_bb, '; 
stmt(7) := 'col_cc + col_ee + DECODE(...), '; 
stmt(8) := 'col_dd) '; 
stmt(9) := 'from table_b '; 
stmt(10) := 'where ... '; 
-- each element can have up to 32K characters, number of elements is (almost) unlimited 
c := DBMS_SQL.open_cursor; 
DBMS_SQL.parse(c, stmt, 1,10, TRUE, DBMS_SQL.NATIVE); 
res := DBMS_SQL.execute(c); 
DBMS_SQL.close_cursor(c); 
    END; 
+0

這解決了我的問題。 –

0

您應該使用CLOB,Character Large OBject。您可以處理32K +字符串長度,因爲CLOB最多可以包含4GB數據。

欲瞭解更多信息:http://docs.oracle.com/javadb/10.3.3.0/ref/rrefclob.html

+1

[SQL語言參考](http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#sthref204)可能是比Derby文檔更好鏈接的地方... –

+0

這些鏈接沒有多大幫助。探索更多clob。謝謝。 –

相關問題