关于 varchar2 的最大长度
varchar2有兩個最大長度:一個是在字段類型4000;一個是在PL/SQL中變量類型32767。今天犯了一個小錯誤,就是函數的varchar2類型的返回值長度也是4000,而不是我以為的32767。
?
想了一下,這是一個比較容易出錯的地方。因為在函數中我可以聲明長度超過4000的字符串變量,并且將它作為返回值,這里是不會提示編譯錯誤的。這個函數平時都可以正常執行,而一旦這個字符串長度超過4000,函數執行就會出錯。所以這個問題雖然比較簡單,仍然記錄一下。
?
C:\Documents?and?Settings\yuechao.tianyc>sqlplus
?
SQL*Plus:?Release?10.2.0.1.0?-?Production?on?星期二?5月?5?17:15:59?2009
?
Copyright?(c)?1982,?2005,?Oracle.??All?rights?reserved.
?
請輸入用戶名:??test/test
?
連接到:
Oracle?Database?10g?Enterprise?Edition?Release?10.2.0.1.0?-?Production
With?the?Partitioning,?OLAP?and?Data?Mining?options
?
SQL>?create?or?replace?function?funny?return?varchar2
??2??is
??3????v_yct?varchar2(32767);
??4??begin
??5????v_yct?:=?rpad('a',?4001,?'b');
??6????return?v_yct;
??7??end;
??8??/
?
函數已創建。
?
SQL>?select?funny?from?dual;
select?funny?from?dual
???????*
第?1?行出現錯誤:
ORA-06502:?PL/SQL:?數字或值錯誤?:??字符串緩沖區太小
ORA-06512:?在?"TEST.FUNNY",?line?6
?
本來以為記錄下來就好。剛才跟一位同事討論了一下,認為有可能在schema級varchar2的長度限制都是4000,而在PL/SQL代碼級的長度限制是32767。下面繼續測試:
?
--?1.?作為函數入參的限制是32767
SQL>?create?or?replace?function?funny(?p_char?in?varchar2?)?return?number
??2??is
??3??begin
??4????return?length(p_char);
??5??end;
??6??/
?
函數已創建。
?
SQL>?declare
??2????v_char?varchar2(32767);
??3??begin
??4????v_char?:=?rpad('a',?32767,?'b');
??5????dbms_output.put_line(funny(v_char));
??6??end;
??7??/
32767
?
PL/SQL?過程已成功完成。
?
--?2.?同樣的函數,在schema級和在PL/SQL代碼級長度限制不同
SQL>?select?length(rpad('a',?4001,?'b'))?from?dual;
?
LENGTH(RPAD('A',3276558,'B'))
-----------------------------
?????????????????????????4000
?
SQL>?begin
??2????dbms_output.put_line(length(rpad('a',?4001,?'b')));
??3??end;
??4??/
4001
?
PL/SQL?過程已成功完成。
?
?
如果中間結果字符串長度超過限制會怎樣呢?
?
(1)在PL/SQL中,如果中間結果超過32767,沒有影響:
?
SQL>?declare
??2????v_char1?varchar2(32767);
??3????v_char2?varchar2(32767);
??4????v_char3?varchar2(10);
??5??begin
??6????v_char1?:=?lpad('a',?32767,?'a');
??7????v_char2?:=?lpad('b',?32767,?'b');
??8????v_char3?:=?substr(v_char1?||?v_char2,?32763,?10);
??9????dbms_output.put_line(v_char3);
?10??end;
?11??/
aaaaabbbbb
?
PL/SQL?過程已成功完成。
?
(2)在schema級如果中間結果超過4000,會提示錯誤:
?
SQL>?select?substr(rpad('a',?4000,?'a')||rpad('b',?4000,?'b'),?3996,?10)?from?dual;
select?substr(rpad('a',?4000,?'a')||rpad('b',?4000,?'b'),?3996,?10)?from?dual
?????????????????????????????????????????????????????????????????????????*
第?1?行出現錯誤:
ORA-01489:?字符串連接的結果過長
?
?
如果字符串長度超過限制怎么辦?可以使用CLOB類型。比如最開始的那個例子,可以將返回值改為CLOB類型:
?
SQL>?create?or?replace?function?funny?return?clob
??2??is
??3????v_yct?varchar2(32767);
??4??begin
??5????v_yct?:=?rpad('a',?4001,?'b');
??6????return?v_yct;
??7??end;
??8??/
?
函數已創建。
?
SQL>?select?funny?from?dual;
?
FUNNY
--------------------------------------------------------------------------------
abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
?
SQL>?set?long?10000
SQL>?select?funny?from?dual;
FUNNY
--------------------------------------------------------------------------------
abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
.
?
這樣返回字符串的最大長度就是32767了。
轉載于:https://www.cnblogs.com/king12345678/archive/2013/01/21/2870294.html
總結
以上是生活随笔為你收集整理的关于 varchar2 的最大长度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript|拖拽|仿Andro
- 下一篇: 新个人项目-- 拼图游戏