2013-07-01 46 views
2

PL/SQL變量的聲明要求設置長度VARCHAR2像類型:當你試圖避免在字符串長度中使用魔術數字時,是否使用PL/SQL代碼中的錯誤練習的clob類型?

declare 
    query varchar2(2000); 
begin 
    for i in 1..100 loop 
    query := query || to_char(i); 
    end loop; 
    dbms_output.put_line(query); 
end; 
/

我在陷阱當產品要求的變化,以便循環範圍變大運行(設定範圍1..1000在我例如),我得到了錯誤:

ORA-06502: PL/SQL: : буфер символьных строк слишком маленький ошибка числа или значения ORA-06512: на line 5 

所以我需要增加查詢長度無處不在,甚至與一些較大數量的謂詞的未來。

這很難看。我不是PL/SQL的專家,但通過閱讀官方文檔,我發現clob類型,它不需要長度和快速檢查顯示我的代碼工作!

PL/SQL代碼變得更像Pascal,更像Python/Ruby/Perl。我很喜歡。

我只對動態構建的字符串應用了類型轉換,這些字符串沒有使用密集的循環。

這樣的技術是正確的還是我錯了?

PS我大一PL/SQL編程所以問這樣愚蠢的問題...

PPS一個工作代碼(簡化):

queryStr := 'create or replace view "DATA_VIEW" ("DT", "MONEY", "EVENT") as ('; 
for eventRec in eventCur 
loop 
    queryStr := queryStr || 'select DT, MONEY, ' || eventRec.ID 
    || ' EVENT from ' || eventRec.tbl || ' union '; 
end loop; 
queryStr := rtrim(queryStr, ' union ') || ')'; 
execute immediate queryStr; 
commit; 
+2

在PL/SQL最大將VARCHAR2(32767)的值。如果你生成的動態查詢大於這個,我可能會完全問你的方法。 Clobs可以在技術上拯救你,但我想看看那個查詢看起來像什麼! – tbone

+0

@tbone因此,要以defencive的方式,我只需要聲明每個不可預知的長度** VARCHAR2 **爲32767字節長? – gavenkoa

+0

@tbone我使用這種可變長度的字符串來創建動態查詢,以便它們脫離任何循環並且沒有性能問題(如果您與表格行上的循環進行比較)... – gavenkoa

回答

4

CLOB數據類型是你的如果你想操縱SQL中大於4000字節的字符串或PL/SQL中的32 kB字符串,那麼只有真正的選項。

CLOB的操作比上VARCHAR2爲小弦,雖然有點貴,所以用大串打交道時,你應該只使用CLOB數據類型。因此,VARCHAR2數據類型仍然有其用處,不要過分用CLOB替換所有的字符串。

+0

請注意,我不會用CLOB替換每個VARCHAR2。我的主要觀點是爲動態構建字符串設置固定長度(其長度取決於數據內容,而不是DDL)是醜陋的......無論如何感謝您的興趣+1 – gavenkoa

1

看着你的示例工作代碼,我的理解是你想動態生成一個由大約數百個聯合語句組成的視圖定義,每個聯合語句查詢不同的表。

存儲在數百個不同表格中的相似數據!現在這是一個奇怪的數據庫架構!反正,只是一味的用clob替換varcar2並不是從性能的角度來推薦的。

爲什麼不保留計數器/檢查'eventCur'(eventRec)中的記錄數?

然後你可以選擇最佳的爲櫃檯上方,你可以使用CLOB數據類型,並可以在低於該VARCHAR2數據類型..

+0

感謝您對問題的興趣。 +1。我肯定必須突出** ** clob **字符串的任何擴展循環)) – gavenkoa

相關問題