日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于 varchar2 的最大长度

發布時間:2025/3/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于 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 的最大长度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。