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



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


...全文
2101 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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

17,140

社区成员

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

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