xzh2000的博客 本人提供杭州地区Oracle现场技术支持服务,包括性能调整、DataGuard、RAC等。
19 09, 2006
ORA-01460的重现与解决
作者 xzh2000 18:18 | Permalink 静态链接网址 | Comments 最新回复 (0) | Trackback 引用 (0) | 技术交流

今天开发工程师说收到应用报ORA-01460错误,然后提交了报错的sql语句,该sql中用到了str2varlist函数,str2varlist有一个输入参数,该形参数据类型是varchar2,具体的创建语法请叁考链接,从sql看,语法没有问题,确定问题在实参上,如何重现该错误呢?示例代码如下:


15:26:44 SQL> declare
15:28:38 2 v_n1 varchar2(5000);
15:28:38 3 v_n2 varchar2(5000);
15:28:38 4 v_n varchar2(20000);
15:28:38 5 v_cnt number;
15:28:38 6 begin
15:28:38 7 v_n1 := rpad('a',2001,'*');
15:28:38 8 v_n2 := rpad('a',2001,'*');
15:28:38 9 v_n := v_n1||','||v_n2; --这个地方v_n长度是4003,执行是没有问题的,符合plsql运算规范15:28:38 10
15:28:38 11 select count(*) into v_cnt15:28:38 12 from table(str2varlist(v_n));
15:28:38 13 dbms_output.put_line(v_n);
15:28:38 14 end;
15:28:39 15 /
declare
*
ERROR at line 1:
ORA-01460: unimplemented or unreasonable conversion requested
ORA-06512: at line 11

15:28:40 SQL> declare
15:28:53 2 v_n1 varchar2(10000);
15:28:53 3 v_n2 varchar2(10000);
15:28:53 4 v_n varchar2(30000);
15:28:53 5 v_cnt number;
15:28:53 6 begin
15:28:53 7 v_n1 := rpad('a',1001,'*');
15:28:53 8 v_n2 := rpad('a',1001,'*');
15:28:53 9 v_n := v_n1||','||v_n2;
15:28:53 10
15:28:53 11 select count(*) into v_cnt
15:28:53 12 from table(str2varlist(v_n));
15:28:53 13 dbms_output.put_line(v_n);
15:28:53 14 end;
15:28:53 15 /
PL/SQL procedure successfully completed.

根据测试,发现这是一个常识性的错误,即函数的varchar2类型的实参长度是不能超过4000的,不仅自定义的函数有这个限制,系统内置函数也有4000这个限制的,比如:

SQL>select length(rpad('a',4001,'*')) from dual;
LENGTH(RPAD('A',4001,'*'))
--------------------------
4000
Comments
博客日历
« 八月 2008 »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
搜索
最新发表
文章分类
文章归档
网站链接
新闻聚合