|
今天开发工程师说收到应用报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
|