Home » SQL & PL/SQL » SQL & PL/SQL » split long string (sql 11g)
| split long string [message #577727] |
Tue, 19 February 2013 22:27  |
 |
mahnazzz
Messages: 75 Registered: July 2011 Location: Iran
|
Member |
|
|
Hello.
would you please tell me how I can change this function to pass argument that length is 32676 .
create or replace TYPE "HRS_SPLIT_TBL_T" as table of varchar2(32767);
create or replace function hrs_split
(
p_list varchar2,
p_del varchar2 := ','
) return hrs_split_tbl_t pipelined
is
l_idx pls_integer;
l_list varchar2(32767) := p_list;
l_value varchar2(32767);
begin
loop
l_idx := instr(l_list,p_del);
if l_idx > 0 then
pipe row(substr(l_list,1,l_idx-1));
l_list := substr(l_list,l_idx+length(p_del));
else
pipe row(l_list);
exit;
end if;
end loop;
return;
end hrs_split;
I got error String literal too long when execute select below
select distinct COLUMN_VALUE Tbat_latn
from table(
HRS_SPLIT( 'PER0000002,PER0000094,PER0000094,PER0000096,PER0000096,
PER0000024,PER0000024,SAB0000001,SAB0000001,PER0000002,
PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,
PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,
PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,
PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,
PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,
PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,
PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,
PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,
PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,
PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,
PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,
PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,
PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,
PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,
PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,
PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,
PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,
PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,
PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,
PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,
PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,
PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,
PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,P ER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PE R0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER 0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0 000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER00 00096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER000 0024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000 024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER00000 24,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER000002 4,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024 ,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024, PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,P ER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PE R0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER 0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000096,PER0 000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER00 00096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER000 0094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000002,PER0000 024,PER0000024,PER0000096,PER0000094,PER0000002,PER0000024,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER00000 94,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER000009 4,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,SAB0000001,SAB0000001,PER0000002,PER0000024,PER0000024,PER0000096 ,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,SAB0000001,SAB0000001,PER0000002,PER0000024, PER0000024,PER0000096,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,SAB0000001,SAB0000001,PER0000002,P ER0000024,PER0000024,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,SAB0000001,SAB0000001,PER0000002,PE R0000024,PER0000024,PER0000096,PER0000094,SAB0000001,SAB0000001,PER0000002,PER0000024,PER0000096,PER0000094,PER0000002,PER0000024,PER 0000024,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0 000096,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000002,PER0000094,PER0000094,
PER0000096,PER0000096,PER0000024,PER0000024'))
[Updated on: Wed, 20 February 2013 01:13] by Moderator Report message to a moderator
|
|
|
|
|
|
|
|
|
|
|
|
| Re: split long string [message #577829 is a reply to message #577828] |
Thu, 21 February 2013 01:12   |
 |
sss111ind
Messages: 267 Registered: April 2012 Location: India
|
Senior Member |

|
|
Yes Michel,
I changed it to as follows,I called with above long string.and my type is still table of varchar2(100)
CREATE OR REPLACE
FUNCTION hrs_split(
p_list CLOB,
p_del VARCHAR2 := ',' )
RETURN hrs_split_tbl_t pipelined
IS
l_idx pls_integer;
l_list CLOB := p_list;
l_value VARCHAR2(32767);
BEGIN
LOOP
l_idx := instr(l_list,p_del);
IF l_idx > 0 THEN
pipe row(SUBSTR(l_list,1,l_idx-1));
l_list := SUBSTR(l_list,l_idx +LENGTH(p_del));
ELSE
pipe row(l_list);
EXIT;
END IF;
END LOOP;
RETURN;
END hrs_split;
[Updated on: Thu, 21 February 2013 01:13] Report message to a moderator
|
|
|
|
| Re: split long string [message #577830 is a reply to message #577829] |
Thu, 21 February 2013 01:17   |
 |
Michel Cadot
Messages: 54126 Registered: March 2007 Location: Nanterre, France, http://...
|
Senior Member Account Moderator |
|
|
Quote:I called with above long string.
So you did not use a variable as I said and you didn't try to understand what I posted:
Quote:a string literal cannot be greater than 4000 bytes.
I should post this as point 1 as this is the main whatever is your function.
Regards
Michel
[Updated on: Thu, 21 February 2013 01:18] Report message to a moderator
|
|
|
|
| Re: split long string [message #577831 is a reply to message #577830] |
Thu, 21 February 2013 01:27   |
 |
Michel Cadot
Messages: 54126 Registered: March 2007 Location: Nanterre, France, http://...
|
Senior Member Account Moderator |
|
|
SQL> CREATE OR REPLACE
2 FUNCTION hrs_split(
3 p_list CLOB,
4 p_del VARCHAR2 := ',' )
5 RETURN hrs_split_tbl_t pipelined
6 IS
7 l_idx pls_integer;
8 l_list CLOB := p_list;
9 l_value VARCHAR2(32767);
10 BEGIN
11 LOOP
12 l_idx := instr(l_list,p_del);
13 IF l_idx > 0 THEN
14 pipe row(SUBSTR(l_list,1,l_idx-1));
15 l_list := SUBSTR(l_list,l_idx +LENGTH(p_del));
16 ELSE
17 pipe row(l_list);
18 EXIT;
19 END IF;
20 END LOOP;
21 RETURN;
22 END hrs_split;
23 /
Function created.
SQL> var v clob
SQL> begin
2 :v := 'PER0000002,PER0000094,PER0000094,PER0000096,PER0000096,
3 PER0000024,PER0000024,SAB0000001,SAB0000001,PER0000002,
4 PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,
5 PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,
6 PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,
7 PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,
8 PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,
9 PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,
10 PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,
11 PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,
12 PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,
13 PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,
14 PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,
15 PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,
16 PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,
17 PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,
18 PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,
19 PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,
20 PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,
21 PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,
22 PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,
23 PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,
24 PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,
25 PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,';
26 end;
27 /
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000024,PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000094,PER0000002,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000024,PER0000096,PER0000094,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000002,PER0000024,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000024,PER0000096,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000002,PER0000024,PER0000096,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000096,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,SAB0000001,SAB0000001,PER0000002,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000096,PER0000094,SAB0000001,SAB0000001,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,SAB0000001,SAB0000001,PER0000002,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000024,PER0000024,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'SAB0000001,SAB0000001,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,SAB0000001,SAB0000001,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000002,PER0000024,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000094,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000096,PER0000096,PER0000094,PER0000002,PER0000024,PER0000024,PER0000096,PER0000096,PER0000094,'
PL/SQL procedure successfully completed.
SQL> exec :v:= :v || 'PER0000002,PER0000094,PER0000094,PER0000096,PER0000096,PER0000024,PER0000024''
ERROR:
ORA-01756: quoted string not properly terminated
SQL> exec :v:= :v || 'PER0000002,PER0000094,PER0000094,PER0000096,PER0000096,PER0000024,PER0000024'
PL/SQL procedure successfully completed.
SQL> select COLUMN_VALUE
2 from table(HRS_SPLIT(:v));
COLUMN_VALUE
--------------------------------------------
PER0000002
PER0000094
PER0000094
PER0000096
PER0000096
...
PER0000024
PER0000096
PER0000096
PER0000094
PER0000002
PER0000094
PER0000094
PER0000096
PER0000096
PER0000024
PER0000024
450 rows selected.
Regards
Michel
|
|
|
|
|
|
| Re: split long string [message #577834 is a reply to message #577832] |
Thu, 21 February 2013 02:03   |
lzfhope
Messages: 61 Registered: July 2006
|
Member |
|
|
Michel had said all the detail.
first:you must declare a clob variable ,
seond:set value to the variable,how to set is not the stress of this topic.
third:pass the variable to the function,
literial is unavailable.
|
|
|
|
|
|
|
|
| Re: split long string [message #577902 is a reply to message #577892] |
Thu, 21 February 2013 10:15  |
 |
Michel Cadot
Messages: 54126 Registered: March 2007 Location: Nanterre, France, http://...
|
Senior Member Account Moderator |
|
|
You have to use PL/SQL if your language is PL/SQL (like with SQL*Plus).
You have to use bind variable, this is a fact as string literal cannot etc.
Regards
Michel
|
|
|
|
Goto Forum:
Current Time: Sat May 18 15:59:13 CDT 2013
Total time taken to generate the page: 0.77963 seconds
|