今天开发工程师说收到应用报ORA-01460错误,然后提交了报错的sql语句,该sql中用到了str2varlist函数,str2varlist有一个输入参数,该形参数据类型是varchar2,具体的创建语法请叁考链接,从sql看,语法没有问题,确定问题在实参上,如何重现该错误呢?示例代码如下:[@more@] 今天开发工程师说收到应用报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
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/34329/viewspace-917915/
,如需转载,请注明出处,否则将追究法律责任。