项目中遇到一个问题,需要向一个存储过程传入一个大的数据,开始是想作为一个vachar2传入,结果发现可能是数据过大,总是报ORA-01460: 转换请求无法实现或不合理错误,所以想把数据作为一个CLOB传入,数据格式为A,AA,AAA,AAAAA@B,BB,BBB,BBBB@,我想在存储过程中能不能解析一下传入的CLOB,然后,以@为分隔符,取出数据,就是说,对传入的CLOB做一个操作,最后能把其中的数据分割成如下形势
A,AA,AAA,AAAAA
B,BB,BBB,BBBB谢谢赐教!!!
A,AA,AAA,AAAAA
B,BB,BBB,BBBB谢谢赐教!!!
解决方案 »
- oracle 给定年份,查出每月有多少条数据
- win7如何添加oracle odbc数据源
- oracle触发器insert时,数据的连接符问题[在线给分]
- refcursor是什么意思?帮我看一下好吗?
- java ArrayIndexOutOfBoundsException KeyStore
- 左连接更新表的数据
- oracle 已经安装好了,但是登录不上,请高手指教,在线等,一定给分
- ERROR:ORA-12560 TNS protocol adapter error
- 用oracle光盘安装不上,报错“inventory目录位置无效” ?在线等待?
- 关于sequence的问题!!!!!
- informaker连接oracle数据库时候报错:ora-00942:table or view does not exist
- oracle存储过程编写的问题1
A,AA,AAA,AAAAA
B,BB,BBB,BBBB
这样的形式不行么?
v_getstr VARCHAR2(32000);
v_str CLOB;
BEGIN
v_str := i_sep || i_str || i_sep;
FOR i IN 1 .. length(v_str) - length(REPLACE(v_str, i_sep)) - 1 LOOP
v_getstr := substr(v_str,
instr(v_str, i_sep, 1, i) + 1,
instr(v_str, i_sep, 1, i + 1) -
instr(v_str, i_sep, 1, i) - 1);
--v_getstr即为分离的字符串
dbms_output.put_line(v_getstr);
END LOOP;
END splitstr;
procedure saveSmsHistory(v_sms_history in clob)is
v_getstr VARCHAR2(32000);
v_str CLOB;
BEGIN
v_str :='@'|| v_sms_history || '@';
FOR i IN 1 .. length(v_str) - length(REPLACE(v_str, '@')) - 1 LOOP
v_getstr := substr(v_str,
instr(v_str, '@', 1, i) + 1,
instr(v_str, '@', 1, i + 1) -
instr(v_str, '@', 1, i) - 1);
--v_getstr即为分离的字符串
dbms_output.put_line(v_getstr);
END LOOP;
END;
运行后报
java.sql.SQLException: ORA-06502: PL/SQL: 数字或值错误 ,错误指向
FOR i IN 1 .. length(v_str) - length(REPLACE(v_str, '@')) - 1 LOOP行
我确定我传入的数据确实是
A,AA,AAA,AAAAA@B,BB,BBB,BBBB@请大虾赐教!!!
--clob测试SQL> create or replace type varchar2_tt as table
2 of varchar2 (1000);
3 /
Type created
SQL>
SQL> create or replace
2 function in_list( p_string in clob ,p_delimiter in varchar2 default ',',len in out number)
3 return varchar2_tt
4
5 as
6
7 l_data varchar2_tt := varchar2_tt();
8 n number;
9 l_string clob:=p_string ;
10 l_delimiter clob:=to_clob(p_delimiter);
11 v_str varchar2(32767);
12 begin
13 dbms_lob.append(dest_lob => l_string,src_lob =>l_delimiter) ;
14 loop
15 n := dbms_lob.instr(lob_loc => l_string,pattern => l_delimiter);
16 v_str:= trim(dbms_lob.substr(lob_loc => l_string,amount => n-1,offset => 1));
17 exit when v_str is null;
18 l_data.extend;
19 l_data(l_data.count) := v_str ;
20 len := length( l_data(l_data.count))+dbms_lob.getlength(l_delimiter)+len;
21 dbms_lob.erase(lob_loc => l_string,amount => len);
22 end loop;
23 return l_data;
24 end;
25 /
Function created
SQL> declare
2 lens number default 0;
3 l_data varchar2_tt := varchar2_tt();
4 l_string clob:=to_clob('A,AA,AAA,AAAAAB,BB,BBB,BBBB');
5 begin
6 l_data := in_list(p_string => l_string,len => lens);
7 for i in l_data.first .. l_data.last loop
8 dbms_output.put_line(l_data(i));
9 end loop;
10 end;
11 /
A
AA
AAA
AAAAAB
BB
BBB
BBBB
PL/SQL procedure successfully completed
SQL>
SQL> declare
2 lens number default 0;
3 l_data varchar2_tt := varchar2_tt();
4 l_string clob:=to_clob('A,AA,AAA,AAAAA@B,BB,BBB,BBBB@');
5 begin
6 l_data := in_list(p_string => l_string,p_delimiter =>'@',len => lens);
7 for i in l_data.first .. l_data.last loop
8 dbms_output.put_line(l_data(i));
9 end loop;
10 end;
11
12 /
A,AA,AAA,AAAAA
B,BB,BBB,BBBB
PL/SQL procedure successfully completed