您的位置:首页 > 数据库 > Oracle

[Oracle Misc] Varchar2 in SQL and PL/SQL, etc

2010-01-04 15:35 459 查看
Varchar2的大小限制在SQL和PL/SQL中是不一样的,这点经常被忘记,因此会遇到一些问题。

OracleSQL中Varchar2类型只支持最大4000bytes,而pl/sql则可以支持最大32767bytes的大小!在创建OracleTable时,如果一个列存储的数据大于4000bytes时候,最好换成CLOB类型。

下面进行一些测试看看,

[code]SQL>select*fromv$versionwhererownum=1;
BANNER
----------------------------------------------------------------
OracleDatabase10gEnterpriseEditionRelease10.2.0.4.0-Prod
[/code]

先看看简单的SQL语句,看看最多能返回多长字符串,


[code]SQL>selectlength(rpad('A',3999,'*'))fromdual;
LENGTH(RPAD('A',3999,'*'))
--------------------------
3999
SQL>selectlength(rpad('A',4000,'*'))fromdual;
LENGTH(RPAD('A',4000,'*'))
--------------------------
4000
SQL>selectlength(rpad('A',4001,'*'))fromdual;
LENGTH(RPAD('A',4001,'*'))
--------------------------
4000
SQL>selectlength(rpad('A',40001,'*'))fromdual;
LENGTH(RPAD('A',40001,'*'))
---------------------------
4000
SQL>
[/code]

可以看到,当对RPAD的参数设置超过4000时,最后返回的结果也只是4000.


[code]SQL>selectrpad('A',4000,'*')||'T'fromdual;
selectrpad('A',4000,'*')||'T'fromdual
*
ERRORatline1:
ORA-01489:resultofstringconcatenationistoolong
[/code]

当选出的字符串超过4000的时候,会报错。

这就就提示我们,当通过调用一个存储过程来得到结果的时候需要注意这个存储过程返回的结果的长度有多少,来测试下,


[code]SQL>CREATEORREPLACEFUNCTIONtest_varchar2_max_lengthRETURNvarchar2AS
2BEGIN
3returnRPAD('A',4001,'*');
4END;
5/
Functioncreated.
SQL>selecttest_varchar2_max_lengthfromdual;
selecttest_varchar2_max_lengthfromdual
*
ERRORatline1:
ORA-06502:PL/SQL:numericorvalueerror:characterstringbuffertoosmall
ORA-06512:at"FRANK.TEST_VARCHAR2_MAX_LENGTH",line3
SQL>
[/code]

函数test_varchar2_max_length返回了一个长度为4001的字符串(远小于PL/SQL支持的32767的大小),但是SELECT语句却报错了。

解决这个问题的一个方法是改变函数的返回值类型,将varchar2改成clob,虽然从PL/SQL角度来说完全没有必要!


[code]SQL>CREATEORREPLACEFUNCTIONtest_varchar2_max_lengthRETURNCLOBAS
2BEGIN
3returnRPAD('A',4001,'*');
4END;
5/
Functioncreated.
[/code]

[code]
SQL>selecttest_varchar2_max_lengthfromdual;
TEST_VARCHAR2_MAX_LENGTH
--------------------------------------------------------------------------------
A*******************************************************************************
SQL>setlong5000
SQL>/
TEST_VARCHAR2_MAX_LENGTH
--------------------------------------------------------------------------------
A*******************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
TEST_VARCHAR2_MAX_LENGTH
--------------------------------------------------------------------------------
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
TEST_VARCHAR2_MAX_LENGTH
--------------------------------------------------------------------------------
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
TEST_VARCHAR2_MAX_LENGTH
--------------------------------------------------------------------------------
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
TEST_VARCHAR2_MAX_LENGTH
--------------------------------------------------------------------------------
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
********************************************************************************
*
SQL>
[/code]

----其他------------------

(1)如何把CLOB转成VARCHAR2


[code]
dbms_lob.substr(clob_column,for_how_many_bytes,from_which_byte);
[/code]


[code]
SQL>selectDBMS_LOB.SUBSTR(test_varchar2_max_length,1,1)fromdual;
DBMS_LOB.SUBSTR(TEST_VARCHAR2_MAX_LENGTH,1,1)
-----------------------------------------------------------------------------
A
[/code]

(2)setserveroutputon&dbms_output.enable

SETSERVEROUTPUTON是SQL*PLUS命令,其实跟调用DBMS_OUTPUT.ENABLE是一样的

关于DBMS_OUTPUT的用法,参见这里.

(3)DBMS_OUTPUTenhancementinoracle10.2

注意包含两部分,

lengthlimit(255bytes–>32767bytes)

bufferlimit


[code]SQL>setserveroutputonsize1000
SP2-0547:sizeoption1000outofrange(2000through1000000)
SQL>setserveroutputonsize1000000000000
SP2-0547:sizeoption3567587328outofrange(2000through1000000)
[/code]
Theunconstrainedsetserveroutputonsettingisnowequivalenttosetserveroutputonsizeunlimited.Bothofthesesqlpluscommandsexecute"DBMS_OUTPUT.ENABLE(NULL)"whichcanbeseeninthetracefileifrunningwithSQLtraceon.

[code]SQL>setserveroutputonsizeunlimited
SQL>showserveroutput
serveroutputONSIZEUNLIMITEDFORMATWORD_WRAPPED
SQL>setserveroutputon
SQL>showserveroutput
serveroutputONSIZEUNLIMITEDFORMATWORD_WRAPPED
[/code]

-----End----
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: