[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类型。
下面进行一些测试看看,
先看看简单的SQL语句,看看最多能返回多长字符串,
可以看到,当对RPAD的参数设置超过4000时,最后返回的结果也只是4000.
当选出的字符串超过4000的时候,会报错。
这就就提示我们,当通过调用一个存储过程来得到结果的时候需要注意这个存储过程返回的结果的长度有多少,来测试下,
函数test_varchar2_max_length返回了一个长度为4001的字符串(远小于PL/SQL支持的32767的大小),但是SELECT语句却报错了。
解决这个问题的一个方法是改变函数的返回值类型,将varchar2改成clob,虽然从PL/SQL角度来说完全没有必要!
----其他------------------
(1)如何把CLOB转成VARCHAR2
(2)setserveroutputon&dbms_output.enable
SETSERVEROUTPUTON是SQL*PLUS命令,其实跟调用DBMS_OUTPUT.ENABLE是一样的
关于DBMS_OUTPUT的用法,参见这里.
(3)DBMS_OUTPUTenhancementinoracle10.2
注意包含两部分,
lengthlimit(255bytes–>32767bytes)
bufferlimit
Theunconstrainedsetserveroutputonsettingisnowequivalenttosetserveroutputonsizeunlimited.Bothofthesesqlpluscommandsexecute"DBMS_OUTPUT.ENABLE(NULL)"whichcanbeseeninthetracefileifrunningwithSQLtraceon.
-----End----
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)
注意包含两部分,
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----
相关文章推荐
- Declare Variables, Constants and Types in Oracle PL/SQL
- Oracle PL/SQL之IN OUT NOCOPY
- SQL trace, 10046, trcsess and tkprof in Oracle 10g(转)
- Dynamic SQL Using OPEN FOR in Oracle PL/SQL
- [bbk4979]第06集 - Chapter 04- Interacting with Oracle Database Server:SQL Statements in PL/SQL Programs(01)
- DROP TABLE IF EXISTS” in Oracle and SQL Server
- oracle帮助文档——PL/SQL Packages and Types Reference
- START WITH and CONNECT BY in Oracle SQL
- SQL SELECT TOP N equivalent in ORACLE and MySQL
- Data Types with Different Maximum Sizes in oracle PL/SQL and SQL
- Expert PL/SQL Practices for Oracle Developers and DBAs
- Just another way of debug logging in Oracle PL/SQL
- Oracle培训方案(英文版)_SQL and PL SQL
- SQL trace, 10046, trcsess and tkprof in Oracle 10g
- Named system exception in Oracle - Predefined PL/SQL Exceptions
- Enable trace 10046 in Oracle PL/SQL
- DROP TABLE IF EXISTS” in Oracle and SQL Server
- Oracle通过PL/SQL Developer导出数据为CSV格式,VARCHAR2类型的字段如果存入的是数值(例如3307830000004059)太长,最后一位会被置为0
- PL/SQL Enhancements in Oracle Database 10g
- Oracle PL/SQL之VARCHAR2 QUALIFIER