Oracle Varchar2 LONG 长度?

东北小硬人 2010-04-01 09:28:44
突然在写程序的时候发现了个小问题,环境为Oracle10g,工具PL\SQL DEVELOPER7.1.5 ,写一个存储过程
例如:
有一个变量 V_I IN VARCHAR2(4000);
下面我求出传入的字符串的长度
CREATE OR REPLACE PROCEDURE TEST_LENGTH(
V_I varchar2--传入参数
) IS
V_I_STR varchar2(4000);--传入参数
v_r number(8);--计数
BEGIN

V_I_STR := V_I;--传入参数

select length(V_I_STR) INTO v_r FROM DUAL;

DBMS_OUTPUT.put_line(v_r);

END;
如果我传入的字符串大于2001,就会抛出错误ora-01480 trailing null missing from STR bind value
如果我传入的字符串小于 ,等于2000,就不抛出错误。
不知道Varchar2(4000)为啥缩水了。。。??

如果单独用Length()函数
SELECT LENGTH(str) FROM DUAL;
这里如果str的长度我传入大于4000的就会报错ora-01704 string literal too lang

这里想问Length()函数中的字符串有长度限制啊?

---如果我把存储过程中的参数类型换成 LONG 型
CREATE OR REPLACE PROCEDURE TEST_LENGTH(
V_I LONG--传入参数
) IS
V_I_STR LONG;--传入参数
v_r number(8);--计数
BEGIN

V_I_STR := V_I;--传入参数

select length(V_I_STR) INTO v_r FROM DUAL;

DBMS_OUTPUT.put_line(v_r);

END;

这里我传入的字符串长度 是4000,这时可以通过了。不报错了
但是如果我传入的是4001,这时就又报错了。。ORA-01460: unimplemented or unreasonable conversion requested



请各位大哥们给小弟解答解答,指点迷津下被?呵呵 谢谢哦!


...全文
2041 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
东北小硬人 2010-04-03
  • 打赏
  • 举报
回复
书上是 如各位那么写的,但是好像 在表里面 varchar2(4000) 但是存储过程中 做为参数就不一样了吧。。你们没有一个试试我写的那个 看你门运行报错不。。愁人!
Adebayor 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 alibert 的回复:]

我改成了32767 但是有错误报出
[/Quote]
报什么错误?
Adebayor 2010-04-02
  • 打赏
  • 举报
回复
SQL> declare
2 a varchar2(32767);
3 begin
4 for i in 1..32767 loop
5 a := a || 't';
6 end loop;
7 dbms_output.put_line(length(a));
8 end;
9 /

32767

PL/SQL procedure successfully completed
gll0809 2010-04-02
  • 打赏
  • 举报
回复
VARCHAR2:存储可变长度字符串,最大4000个字节
LONG :存储可变长度字符数据,最多能存储 2GB。已经很少被使用。
LONG RAW 数据类型用于存储可变长度的二进制数据,最多能存储 2 GB,已经很少被使用
LOB 称为“大对象”数据类型,可以存储多达 4GB 的非结构化信息,例如声音剪辑和视频文件等
CLOB 即 Character LOB(字符 LOB),它能够存储大量字符数据
BLOB 即 Binary LOB(二进制 LOB),可以存储较大的二进制对象,如图形、视频剪辑和声音文件

我昨天刚学了,现学现卖了,呵呵呵.....
tangren 2010-04-02
  • 打赏
  • 举报
回复
修改这个声明
V_I_STR varchar2(32767);--传入参数

如果表中,VARCHAR2则最大只能是4000字节;
在存储过程中,VARCHAR2最大可到32767字节;

oracle推荐使用clob和blob,限制较少;
oracle不推荐使用long了。

long最大可达2G,
clob最大可达4G
东北小硬人 2010-04-02
  • 打赏
  • 举报
回复
select userenv('language') from dual;

得出:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
请问字符集对oracle 的varchar2 的长度是否有影响????
东北小硬人 2010-04-02
  • 打赏
  • 举报
回复
我传入的都是英文字符 没有汉字的。。。
东北小硬人 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tangren 的回复:]
修改这个声明
V_I_STR varchar2(32767);--传入参数

如果表中,VARCHAR2则最大只能是4000字节;
在存储过程中,VARCHAR2最大可到32767字节;

oracle推荐使用clob和blob,限制较少;
oracle不推荐使用long了。

long最大可达2G,
clob最大可达4G
[/Quote]

我改成了32767 但是有错误报出
Adebayor 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 alibert 的回复:]
如果我传入的字符串大于2001,就会抛出错误ora-01480 trailing null missing from STR bind value
如果我传入的字符串小于 ,等于2000,就不抛出错误。
不知道Varchar2(4000)为啥缩水了。。。??
[/Quote]
你传入的是中文字符吧?一个汉字两字节呀
Adebayor 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 adebayor 的回复:]

long的最大长度为:32760
varchar 的最大长度为:32767
[/Quote]
11g是这样子的
定义long是不需要指定长度
varchar2 要这样写:varchar2(32767);
Adebayor 2010-04-01
  • 打赏
  • 举报
回复
long的最大长度为:32760
varchar 的最大长度为:32767
ORACLE中的数据类型.doc 当你在数据库中创建数据表的时候,你需要定义表中所有字段的类型。ORACLE有许多种数据类型以满足你的需要。数据类型大约分为:character, number, date, LOB, 和RAW等类型。虽然ORACLE8i也允许你自定义数据类型,但是它们是最基本的数据类型。在下面的文章中你将了解到他们在oracle 中的用法、限制以及允许值。 l Character 数据类型 Character 数据类型用来存储字母数字型数据。当你在oracle 中定义一个character 数据时,通常需要制定字段的长度,它是该字段的最大长度ORACLE提供以下几种character 数据类型: CHAR() CHAR数据类型是一种有固定长度和最大长度的字符串。存储在数据类型为CHAR字段中的数据将以空格的形式补到最大长度长度定义在1——2000字节之间。 当你创建一个CHAR型字段,数据库将保证在这个字段中的所有数据是定义长度,如果某个数据比定义长度短,那么将用空格在数据的右边补到定义长度。如果长度大于定义长度将会触发错误信息。 VARCHAR() varchar型数据是varchar2型数据的快照。 VARCHAR2() varchar2数据类型是一种可变长度的、有最大长度的字母数字型数据。Varchar2类型的字段长度可以达到4000字节,Varchar2类型的变量长度可以达到32676字节。 一个空的varchar2(2000)字段和一个空的varchar2(2)字段所占用的空间是一样的。 NCHAR() 和 NVARCHAR2() NCHAR() 和 NVARCHAR2()数据类型分别与CHAR() 和 VARCHAR2()类型是相同的,只不过它们用来存储NLS(National Language Support)数据。 LONG LONG 数据类型是一个遗留下来的而且在将来不会被支持的数据类型。它将被LOB(Large Object)数据类型所代替。 比较规则 Varchar2和char数据类型根据尾部的空格有不同的比较规则。对Char型数据,尾部的空格将被忽略掉,对于Varchar2型数据尾部带空格的数据排序比没有空格的要大些。比如: Char 型数据: ‘YO’=‘YO ’ Varchar2型数据: ‘YO’<’YO ’

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧