Passing comma separated string
1) This query works
select a.GSDB_SITE_CODE
from GFSTQ75_GSDB_SITE a
where a.IS_ASSEMBLY_PLANT_FLAG = 'Y'
and a.EFFECTIVE_OUT_DTS = '31-DEC-9999'
and a.ISO3_COUNTRY_CODE IN ('RUS','AUS','SA')
2) This query not working
select a.GSDB_SITE_CODE
from GFSTQ75_GSDB_SITE a
where a.IS_ASSEMBLY_PLANT_FLAG = 'Y'
and a.EFFECTIVE_OUT_DTS = '31-DEC-9999'
and a.ISO3_COUNTRY_CODE IN (SELECT value_text from GFSTU25_PARAMETER_VALUE
WHERE proj_acronym_code = 'CPM'
AND parameter_code ='W130'
AND parameter_qualifier_code='EU_COUNTRY_CODE3')
0 records
But the value_text returned is 'RUS','AUS','SA' from the below query.
SELECT value_text from GFSTU25_PARAMETER_VALUE
WHERE proj_acronym_code = 'CPM'
AND parameter_code ='W130'
AND parameter_qualifier_code='EU_COUNTRY_CODE3'
thanks,
vinodh
Try this way.
SELECT a.GSDB_SITE_CODE
FROM GFSTQ75_GSDB_SITE a
WHERE a.IS_ASSEMBLY_PLANT_FLAG = 'Y'
AND a.EFFECTIVE_OUT_DTS = '31-DEC-9999'
AND a.ISO3_COUNTRY_CODE IN (SELECT REGEXP_SUBSTR (value_text, '[^,]+', 1, LEVEL)
FROM (SELECT value_text
FROM GFSTU25_PARAMETER_VALUE
WHERE proj_acronym_code = 'CPM'
AND parameter_code ='W130'
AND parameter_qualifier_code='EU_COUNTRY_CODE3')
CONNECT BY LEVEL <= regexp_count(value_text,',')+1)some sample check done on SCOTT schema.
SQL> SELECT *
FROM emp
WHERE deptno IN (SELECT REGEXP_SUBSTR ('10,20', '[^,]+', 1, LEVEL)
FROM dual
CONNECT BY LEVEL <= regexp_count('10,20',',')+1)
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 17/12/1980 800.00 200.00 20
7566 JONES MANAGER 7839 02/04/1981 2975.00 200.00 20
7782 CLARK MANAGER 7839 09/06/1981 2450.00 10
7788 SCOTT ANALYST 7566 19/04/1987 3000.00 20
7839 KING PRESIDENT 5000.00 10
7876 ADAMS CLERK 7788 23/05/1987 1100.00 20
7902 FORD ANALYST 7566 03/12/1981 3000.00 20
7934 MILLER CLERK 7782 23/01/1982 1300.00 10
8 rows selectedRegards,
Lokanath Giri
Edited by: Lokanath Giri on १६ मार्च, २०१२ ६:३१ अपराह्न
Similar Messages
-
Passing comma separated string to stored procedure
Hi,
There is thread with same query I created earlier and that was answered. That solution worked if I pass comma separated string containing IDs. But due to changes in the logic, I have to pass usernames instead of userIDs. I tried to modify the solution provided to use with this.
Following the link to previous post :
Re: Passing comma separated string to stored procedure
------Package-------
TYPE refcurQID IS REF CURSOR;
TYPE refcurPubs IS REF CURSOR;
procedure GetAllPersonalQueue (p_user_name in nvarchar2, TestQID OUT Test.refcurQID
, TestPubs OUT Test.refcurPubs);
------Package-------
------Package Body-------
PROCEDURE GetAllPersonalQueue (p_user_name in nvarchar2, TestQID OUT Test.refcurQID, TestPubs OUT Test.refcurPubs) as
BEGIN
Open TestQID for
select id from cfq where name in (p_user_name);
Open TestPubs for
SELECT qid FROM queues WHERE qid in(
select id from cfq where name in (p_user_name));
END GetAllPersonalQueue;
------Package Body-------
Thanks in advance
AdityaHi,
I modified the query as per the solution provided by isotope, after which the logic changed and I am passing username instead of userID in comma separated string.
Following is the changes SP, which does not throw any error, but no data is returned.
PROCEDURE GetAllPersonalQueue (p_user_name in nvarchar2, TestQID OUT Test.refcurQID, TestPubs OUT Test.refcurPubs
) is
--local variable
strFilter varchar2(100);
BEGIN
Open TestQID for
select id, name from cfq where name in
select regexp_substr(p_user_name||',','[a-z]+[0-9]+',1,level)
from dual
connect by level <= (select max(length(p_user_name)-length(replace(p_user_name,',')))+1
from dual)
Open TestPubs for
SELECT qid FROM queues WHERE qid in(
select id from cfq where name in
select regexp_substr(p_user_name||',','[a-z]+[0-9]+',1,level)
from dual
connect by level <= (select max(length(p_user_name)-length(replace(p_user_name,',')))+1
from dual)
END GetAllPersonalQueue;
Edited by: adityapawar on Feb 27, 2009 8:38 AM -
MODEL clause to process a comma separated string
Hi,
I'm trying to parse a comma separated string using SQL so that it will return the parsed values as rows;
eg. 'ABC,DEF GHI,JKL' would return 3 rows;
'ABC'
'DEF GHI'
'JKL'
I'm thinking that I could possibily use the MODEL clause combined with REGULAR expressions to solve this as I've already got a bit of SQL which does the opposite ie. turning the rows into 1 comma separated string;
select id, substr( concat_string, 2 ) as string
from (select 1 id, 'ABC' string from dual union all select 1, 'DEF GHI' from dual union all select 1, 'JKL' from dual)
model
return updated rows
partition by ( id )
dimension by ( row_number() over (partition by id order by string) as position )
measures ( cast(string as varchar2(4000) ) as concat_string )
rules
upsert
iterate( 1000 )
until ( presentv(concat_string[iteration_number+2],1,0) = 0 )
( concat_string[0] = concat_string[0] || ',' || concat_string[iteration_number+1] )
order by id;
Can anyone give me some pointers how to parse the comma separated string using regexp and create as many rows as needed using the MODEL clause?Yes, you could do it without using ITERATE, but FOR ... INCREMENT is pretty much same loop. Couple of improvements:
a) there is no need for CHAINE measure
b) there is no need for CASE in RULES clause
c) NVL can be applies on measures level
with t as (select 1 id, 'ABC,DEF GHI,JKL,DEF GHI,JKL,DEF GHI,JKL,DEF,GHI,JKL' string from dual
union all
select 2,'MNO' string from dual
union all
select 3,null string from dual
SELECT id,
string
FROM T
MODEL
RETURN UPDATED ROWS
partition by (id)
DIMENSION BY (0 POSITION)
MEASURES(
string,
NVL(LENGTH(REGEXP_REPLACE(string,'[^,]+','')),0)+1 NB_MOT
RULES
string[FOR POSITION FROM 1 TO NB_MOT[0] INCREMENT 1] = REGEXP_SUBSTR(string[0],'[^,]+',1,CV(POSITION))
SQL> with t as (select 1 id, 'ABC,DEF GHI,JKL,DEF GHI,JKL,DEF GHI,JKL,DEF,GHI,JKL' string from dual
2 union all
3 select 2,'MNO' string from dual
4 union all
5 select 3,null string from dual
6 )
7 SELECT id,
8 string
9 FROM T
10 MODEL
11 RETURN UPDATED ROWS
12 partition by (id)
13 DIMENSION BY (0 POSITION)
14 MEASURES(
15 string,
16 NVL(LENGTH(REGEXP_REPLACE(string,'[^,]+','')),0)+1 NB_MOT
17 )
18 RULES
19 (
20 string[FOR POSITION FROM 1 TO NB_MOT[0] INCREMENT 1] = REGEXP_SUBSTR(string[0],'[^,]+',1,CV(POSITION))
21 )
22 /
ID STRING
1 ABC
1 DEF GHI
1 JKL
1 DEF GHI
1 JKL
1 DEF GHI
1 JKL
1 DEF
1 GHI
1 JKL
2 MNO
ID STRING
3
12 rows selected.
SQL> SY. -
Look Up For Comma Separated Strings
Hi,
How to look up for comma separated string from livecycle forms manager ??
Plz gimme an idea on this.
Raghava Kumar V.S.S.Hi
My point is that the more detailed you ask your question, the more likely you are to get an answer.
Those of us who monitor these newsgroups also appreciate you doing as much of your own research as possible, before asking us for help - we're more likely to spend our own (personal and valuable) time helping you, if we know that you've spent your own time doing research, and you've still not been able to solve the problem.
I look forward to your next question :-)
Howard -
Revision: 15983
Revision: 15983
Author: [email protected]
Date: 2010-05-10 04:47:46 -0700 (Mon, 10 May 2010)
Log Message:
Updating VideoQoSPluginMetadataSynthesizer to create comma separated string values for all of the available keys.
Modified Paths:
osmf/trunk/apps/samples/plugins/VideoQoSPlugin/src/org/osmf/qos/VideoQoSPluginMetadataSyn thesizer.asRob:
"but the sad thing is, that managers will most likely respond with a "This used to be fast in MSSQL, but now it isn't any more in Oracle. Oracle is so slow ...""
On the bright side, it sounds like most of the database calls are implemented as stored procedures, so there is an opportunity to do it right (in Oracle terms) in the stored procedures.
I did a similar conversion a while back, converting bad SQLServer procedures to good Oracle procedures. Everyone said "Oracle is much faster that SQLServer"
John -
Convert comma separated string in rows
Dear Gurus,
I want to convert comma separated string in rows so as to insert in collection.
e.g. string 1234,2323,23232,2343,34234
Above string should be converted in rows so as to insert in table or collection
Thanks in advance
SanjeevOr slight variation...
SQL> ed
Wrote file afiedt.buf
1 with t as (select '1234,2323,23232,2343,34234' as txt from dual)
2 --
3 select REGEXP_SUBSTR (txt, '[^,]+', 1, level)
4 from t
5* connect by REGEXP_SUBSTR (txt, '[^,]+', 1, level) is not null
6 /
REGEXP_SUBSTR(TXT,'[^,]+',
1234
2323
23232
2343
34234... so it doesn't have to work out how many levels it needs to do, it just keeps going until it get's a no-value (of course that assumes that there is always a value between each comma) -
Read/Insert values from comma separated string
I need Stored procedure to insert values in table using comma separated values from string based on algorithm as below.
There are two table Mtable(Parent table), Ctable(Child table).
Value passed from String can be like_
1,A001,R1,C1,R2,C2,R3,C3
2,A002,X1,Y1,X2,Y2
3,A003,A1,B1,A2,B2,A3,B3
1)For line1 I need to insert in Mtable values(1,A001)
And in ctable I need to insert 3 rows with values
ROW1 (1,R1,C1)
ROW2 (1,R2,C2)
ROW3 (1,R3,C3)
2)For line2 I need to insert in Mtable values(2,A002)
And in ctable I need to insert 2 rows with values
ROW1 (2,X1,Y1)
ROW2 (2,X2,Y2)
Please help me to overcome this.
Thankscreate table t as
select '1,A001,R1,C1,R2,C2,R3,C3' s from dual union
select '2,A002,X1,Y1,X2,Y2' from dual union
select '3,A003,A1,B1,A2,B2,A3,B3' from dual
Table created
select substr(s,1,instr(s,',')-1),
substr(s,instr(s,',',1,2*i)+1,instr(s||',',',',1,2*i+1)-instr(s,',',1,2*i)-1),
substr(s,instr(s,',',1,2*i+1)+1,instr(s||',',',',1,2*i+2)-instr(s,',',1,2*i+1)-1
from t, (select 1 i from dual union select 2 from dual union select 3 from dual)
where instr(s,',',1,2*i+1)>0
order by 1,i
SUBSTR(S,1,INSTR(S,',')-1) SUBSTR(S,INSTR(S,',',1,2*I)+1, SUBSTR(S,INSTR(S,',',1
1 R1 C1
1 R2 C2
1 R3 C3
2 X1 Y1
2 X2 Y2
3 A1 B1
3 A2 B2
3 A3 B3
8 rows selected -
Unable to pass comma separated values for in clause
I have the following query : for :P_LEG_NUM Parameter when i am passing values like 1,2,5 as string type i am getting invalid number error... I have defined in clause for it but still it does not work.. For individual values like 2, etc it works... how can i pass comma separted values for this bind variable
select trip_number as prl_trip_number,
flight_number as prl_f_number,
trip_leg_id as prl_trip_leg_id,
leg_number as prl_leg_num,
dicao as prl_dicao,
etd_zulu as prl_etd_zulu,
aicao as prl_aicao,
eta_zulu as prl_eta_zulu,
to_char(etd_zulu,'DD-Mon-YYYY HH24:MI') as prl_cb_etd,
to_char(eta_zulu,'DD-Mon-YYYY HH24:MI') as prl_cb_eta,
diata as prl_diata,
aiata as prl_aiata,
(select client_name
from xxwfs_trip_header_details t_h
where t_h.trip_number = t_leg.trip_number) as prl_client_name,
(select to_char((select systimestamp at time zone 'GMT' from dual),'YYYY-MM-DD-HH24MI')
from dual) as prl_curr_zulu_date
from xxwfs_trip_leg_details t_leg
where 1=1
and t_leg.leg_number in nvl(:P_LEG_NUM,t_leg.leg_number)
and t_leg.trip_number = :P_trip_noThis is the problem know as <tt>'Varying IN List'</tt> issue.
Check this - SQL and PL/SQL FAQ -
Remove Duplicates From Comma Separated String
Hi,
I have one Column which contains duplicates values with comma separated.
Customer ID
5,5,5,5,6,6,5,5,5,6,7,4,1,2,1,4,7,2
I wrote this:
select REGEXP_REPLACE('5,5,5,5,6,6,5,5,5,6,7,4,1,2,1,4,7,2', '(^|,)([^,]*)(,\2)+','\1\2') from dual;
5,6,5,6,7,4,1,2,1,4,7,2
But it eliminates only continuous elements.
I want out put like:
5,6,7,4,1,2
Please help.
Thanks.
Amit
Edited by: 987565 on Feb 12, 2013 4:02 AMThanks Purvesh,
While testing with real data, it is ignoring some values. I didn't understand why it happening.
with data as
select '5714,5714,5714,5714,5714,5714,5714,5714,5714,5714,5714,5714,5668,5716,5714,5714,5714,5714,5714,5714,5714,5714,5714,5714,5714,5714,5668,5716' col from dual
select ltrim(max(sys_connect_by_path(col, ',')) keep (dense_rank last order by rn - 1), ',') col
from (
select col, row_number() over (order by 1) rn
from (
select distinct regexp_substr(col, '[^,]+', 1, level) col
from data
connect by level <= length(col) - length(replace(col, ','))
start with rn = 1
connect by prior rn = rn - 1;
Result I got is:
5714,5714,5716
My Real Query is like that:
declare
cursor c1 is
select o.id id
from order o;
v_char varchar2(200) := '';
begin
for a1 in c1 loop
with data as
select o.cust_id as col into v_char
from order o
where o.id = a1.id
select ltrim(max(sys_connect_by_path(col, ',')) keep (dense_rank last order by rn - 1), ',') col
from (
select col, row_number() over (order by 1) rn
from (
select distinct regexp_substr(col, '[^,]+', 1, level) col
from data
connect by level <= length(col) - length(replace(col, ','))
start with rn = 1
connect by prior rn = rn - 1;
SYS.dbms_output.put_line(v_char);
end loop;
end;
Later, i will update same cust_id with v_char. -
Comma separated string in rows
Hi All,
I have one table
select * from abcd;
No err
1 rishi,rahul
2 rishi,ak
I want output like:
No ERR
1 rishi
1 rahul
2 rishi
2 ak
i am using the below query for this:
select no,regexp_substr(err,'[^,]+', 1, level) from abcd
connect by regexp_substr(err, '[^,]+', 1, level) is not null
but this query is giving me output:
1
rishi
1
rahul
2
ak
2
rishi
1
rahul
2
ak
if i am using distinct then only desired output is coming.
select distinct no,regexp_substr(err,'[^,]+', 1, level) from abcd
connect by regexp_substr(err, '[^,]+', 1, level) is not null
but i don't want to use distinct because my table has millions of rows and err contains comma separated varchar(6000);
please help me.Something like this?
SQL> ed
Wrote file afiedt.buf
1 WITH table_x AS(
2 SELECT 1 id, 'rishi,rahul' str FROM dual UNION ALL
3 SELECT 2 id, 'rishi,ak' str FROM dual
4 )
5 SELECT id,
6 REGEXP_SUBSTR (str,
7 '[^,]+',
8 1,
9 LEVEL)
10 --LEVEL,
11 --SYS_GUID ()
12 FROM table_x
13 CONNECT BY LEVEL <= LENGTH (REGEXP_COUNT (str, ',')) +1
14 AND PRIOR id = id
15 AND PRIOR Sys_Guid() IS NOT NULL
16* ORDER BY id, LEVEL
SQL> /
ID REGEXP_SUBS
1 rishi
1 rahul
2 rishi
2 ak
Trick here is: the usage of SYS_GUID() i.e. System Global Unique Identifier.
Alternative to this, can also use DBMS_RANDOM.value() here.
Read more here - https://forums.oracle.com/thread/2526535
HTH
-- Ranit -
Inserting the Comma Separated Strings into Table
Hi Seniors,
i had two string and i want to insert the records in the Table COMMENT . In this way.
would u please give some programe to insert the records.
The Data and the Table
( 901,902,903,904 )
( 'hai','nice','good & mail is [email protected] ','excellent and the phone 011-235323' )
comm_id loc_id company_name comments
1 10 901 Hai
2 10 902 nice
3 10 903 good & mail is [email protected]
4 10 904 excellent and the phone 011-235323
Thanks
SeenuHi, Seenu,
In Oracle 10 (and up) you can easily split a comma-delimited list using REGEXP_SUBSTR.
INSTR and SUBSTR can do the same thing in any version, but it's more complicated.
See the general instructions below:
/* How to Split a Delimited String
This shows how to take a single row with a delimited string, such as
Animal amoeba,bat,cedusa,dodo
and transform it into multiple rows:
Animal 1 amoeba
Animal 2 bat
Animal 3 cedusa
Animal 4 dodo
PROMPT ========== -1. sep_char parameter ==========
VARIABLE sep_char VARCHAR2 (10)
EXECUTE :sep_char := ',';
SELECT :sep_char AS sep_char
FROM dual;
PROMPT ========== 0. string_test table ==========
DROP TABLE string_test;
CREATE TABLE string_test
( grp_name VARCHAR2 (10)
, list_txt VARCHAR2 (50)
INSERT INTO string_test (grp_name, list_txt) VALUES ('Animal', 'amoeba,bat,cedusa,dodo');
INSERT INTO string_test (grp_name, list_txt) VALUES ('Date', '15-Oct-1582,16-Oct-2008');
INSERT INTO string_test (grp_name, list_txt) VALUES ('Nothing', NULL);
INSERT INTO string_test (grp_name, list_txt) VALUES ('Place', 'New York');
INSERT INTO string_test (grp_name, list_txt) VALUES ('Skip', 'Hop,,Jump');
SELECT *
FROM string_test
ORDER BY grp_name;
PROMPT ========== Q1. Oracle 11 Query ==========
WITH cntr AS -- Requires Oracle 9
( -- Begin sub-query cntr, to generate n (1, 2, 3, ...)
SELECT LEVEL AS n -- Requires Oracle 9
FROM dual
CONNECT BY LEVEL <= 1 + (
SELECT MAX ( REGEXP_COUNT (list_txt, :sep_char) ) -- Requires Oracle 11
FROM string_test
) -- End sub-query cntr, to generate n (1, 2, 3, ...)
SELECT grp_name
, n
, REGEXP_SUBSTR ( list_txt -- Requires Oracle 10
, '[^' || :sep_char || ']' -- Anything except sep_char ...
|| '+' -- ... one or more times
, 1
, n
) AS item_txt
FROM string_test
JOIN cntr -- Requires Oracle 9
ON n <= 1 + REGEXP_COUNT (list_txt, :sep_char) -- Requires Oracle 11
ORDER BY grp_name
, n;
/* Notes:
REGEXP_SUBSTR (s, '[^,]+', 1, n)
returns the n-th item in a comma-delimited list s.
If there are fewer than n items, it returns NULL.
One or more consecutive characters other than comma make an item, so
'Hop,,Jump' has two items, the second one being 'Jump'.
The sub-query cntr produces a list of integers 1, 2, 3, ..., w
where w is the worst-case (the largest number of items in any list).
This actually counts separators, not items, (e.g., it counts both
commas in 'Hop,,Jump', even though), so the w it produces may be
larger than is really necessary. No real harm is done.
PROMPT ========== Q2. Possible Problems Fixed ==========
WITH cntr AS
( -- Begin sub-query cntr, to generate n (1, 2, 3, ...)
SELECT LEVEL AS n
FROM dual
CONNECT BY LEVEL <= 1 + (
SELECT MAX ( REGEXP_COUNT (list_txt, :sep_char) )
FROM string_test
) -- End sub-query cntr, to generate n (1, 2, 3, ...)
SELECT grp_name
, n
, REGEXP_SUBSTR ( list_txt
, '[^' || :sep_char || ']' -- Anything except sep_char ...
|| '+' -- ... one or more times
, 1
, n
) AS item_txt
FROM string_test
JOIN cntr ON n <= 1 + NVL ( REGEXP_COUNT (list_txt, :sep_char) -- Problem (1)
, 0
WHERE REGEXP_SUBSTR ( list_txt -- Problem (2)
, '[^' || :sep_char || ']' -- Anything except sep_char ...
|| '+' -- ... one or more times
, 1
, n
) IS NOT NULL
OR list_txt IS NULL -- Problems (1) and (2) together
ORDER BY grp_name
, n;
(Possible) Problems and Fixes
(1) If list_txt IS NULL, then REGEXP_COUNT (list_txt, :sep_char)
returns NULL, the join condition fails, and the output
contains nothing corresponding to the row from string_test.
If you want a NULL item to appear in the results, use
NVL to make sure the expression returns 0 instead of NULL.
(2) If list_txt contains multiple consecutive sep_chars (or if it
begins or ends with sep_char, then the original query
will return NULL items. To suppress these, add a WHERE
clause to test that the item_txt to be displayed IS NOT NULL.
PROMPT ========== Q3. Oracle 8.1 Query ===========
SELECT grp_name
, n
, SUBSTR ( list_txt
, begin_pos
, end_pos - begin_pos
) AS item_txt
FROM ( -- Begin sub-query to compute begin_pos and end_pos
SELECT grp_name
, n
, list_txt
, INSTR ( :sep_char || list_txt
, :sep_char
, 1
, n
) AS begin_pos
, INSTR ( list_txt || :sep_char
, :sep_char
, 1
, n
) AS end_pos
FROM string_test
, ( -- Begin sub-query cntr, to generate n (1, 2, 3, ...)
SELECT ROWNUM AS n
FROM all_objects
WHERE ROWNUM <= 1 + (
SELECT MAX ( LENGTH (list_txt)
- LENGTH (REPLACE (list_txt, :sep_char))
FROM string_test
) -- End sub-query cntr, to generate n (1, 2, 3, ...)
cntr
WHERE n <= 1 + ( LENGTH (list_txt)
- LENGTH (REPLACE (list_txt, :sep_char))
) -- End sub-query to compute begin_pos and end_pos
ORDER BY grp_name
, n;
/* Version-Dependent Features and Work-Arounds
The code above, Q3, runs in Oracle 8.1.
The following changes were made to Q1:
(11) REGEXP_COUNT was introduced in Oracle 11.
In earlier versions, to find the number of sep_chars in list_txt,
see how much the LENGTH changes when sep_chars are removed.
(10) REGEXP_SUBSTR was introduced in Oracle 10.
In earlier versions, use INSTR to find where the sep_chars are,
and use SUBSTR to get the sub-strings between them.
(Using this technique, 'Hop,,Jump' still contains three items,
but now item 2 IS NULL and item 3 is 'Jump'.)
(9.a) The WITH-clause was introduced in Oracle 9
In earlier versions, use in-line views.
(9.b) "CONNECT BY LEVEL < constant" doesn't work in Oracle 8.
Use ROWNUM from any sufficiently large table or view instead.
(9.c) ANSII join notation (JOIN table_name ON ...) was introduced in Oracle 9
In earlier versions, join condition go in a WHERE-clause.
*/ -
Converting comma separated string into rows
for my procedure varchar2 is i/p paramter. i will get this i/p from java. this string value is like 'VTP,VR','VM'.
i want to split taht string into rows ie o/p will be
VTR
VR
VM.
how to do this.Hi,
As always, the solution depends on your data, your requirements, and you Oracle version.
Here's one way:
-- Simulating Java input with a bind variable:
VARIABLE str VARCHAR2 (100)
EXEC :str := 'VTP,VR,VM';
SELECT LEVEL AS n
, REGEXP_SUBSTR ( :str
, '[^,]+'
, 1
, LEVEL
) AS str_part
FROM dual
CONNECT BY LEVEL <= 1 + REGEXP_COUNT (:str, ',')
I'm just guessing that your original string doesn't include single-quotes after VR or before VM. If it does, you can use TRIM to remove them from the string passed back by REGEXP_SUBSTR. -
Passing Comma separated input to stored procedure in IN clause
Hi All,
I have a query below in a stored procedure as like this
Create PROCEDURE insertinfo
@userids varchar(MAX)
AS
BEGIN
INSERT INTO records
(id
,name
,address1
,address2
,pincode
SELECT
id,
name,
addr1,
addr2,
pin,
FROM userinfo
WHERE userinfo.id in(@userids)
END
I am not using any dynamic sql. Its a simple insert into select query with multiple parameters supplied via thd @userids parameter. When i run the query nothing is inserting in the "records" table. I have gone throught the web search have
tried with few options but no result yet. The query works fine when i pass only a single value, but it does not work when is pass multiple values.
Please guide on this.
Your help is appreciated.
Thanks,
mds2907mds2907,
CHeck this:
--Method 1
--Usage of TVP
--Method 2
--Usage of SPLIT fn()
Create PROCEDURE insertinfo(@userids varchar(MAX))
AS
BEGIN
INSERT INTO records
(id,name,address1,address2,pincode)
SELECT id, name,addr1,addr2, pin
FROM userinfo
WHERE userinfo.id in(select * from sample_split(@userids,','))
END
--Method3
--Usage of Dynamic SQL
Applicable only when the values in csv are integers
like '1,2,3'
Create PROCEDURE insertinfo(@userids varchar(MAX))
AS
BEGIN
DECLARE @sql nvarchar(max)
SET @sql='
INSERT INTO records
(id,name,address1,address2,pincode)
SELECT id, name,addr1,addr2, pin
FROM userinfo
WHERE userinfo.id in('+@userids')'
EXEC sp_executesql @sql
END
Sample_Split():
CREATE FUNCTION dbo.sample_Split
@RowData nvarchar(2000),
@SplitOn nvarchar(5)
RETURNS @RtnValue table
Id int identity(1,1),
Data nvarchar(100)
AS
BEGIN
Declare @Cnt int
Set @Cnt = 1
While (Charindex(@SplitOn,@RowData)>0)
Begin
Insert Into @RtnValue (data)
Select
Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))
Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
Set @Cnt = @Cnt + 1
End
Insert Into @RtnValue (data)
Select Data = ltrim(rtrim(@RowData))
Return
END
Usage of TVP for a scenario similar to yours is explained herE:
http://blog.sqlauthority.com/2008/08/31/sql-server-table-valued-parameters-in-sql-server-2008/
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/0ead7ceb-3fdd-4625-aa82-1d4195f984b1/passing-multivalue-parameter-in-stored-procedure-ssrs
Thanks,
Jay
<If the post was helpful mark as 'Helpful' and if the post answered your query, mark as 'Answered'> -
Counting the values in comma separated string
Hi I've the following requirement .
The input is like below:
with test as
(select 'ABC,DEF,GHI,JKL,MNO' mystring from dual union all
select 'ABC,DEF' from dual union all
select 'JKL,MNO' from dual )
select * from testAnd the output should be lile below
str cnt
'ABC' 2
'DEF' 2
'GHI' 1
'JKL' 2
'MNO' 2I tried the following query to get like above but getting the wrong output
with test as
(select 'ABC,DEF,GHI,JKL,MNO' mystring from dual union all
select 'ABC,DEF' from dual union all
select 'JKL,MNO' from dual )
select str,count(*) from (
select regexp_substr(mystring,'[^,]+',1,level) str
from test
connect by level <= length(regexp_replace(mystring,'[^,]+')) + 1 )
group by strPlease help me to get the ouput as required
ThanksYou are almost close:
WITH test AS
(SELECT 'ABC,DEF,GHI,JKL,MNO' mystring FROM DUAL
UNION ALL
SELECT 'ABC,DEF' FROM DUAL
UNION ALL
SELECT 'JKL,MNO' FROM DUAL)
SELECT str, COUNT (*)
FROM ( SELECT REGEXP_SUBSTR (mystring,
'[^,]+',
1,
LEVEL)
str
FROM (SELECT ROWNUM r, test.* FROM test) test
CONNECT BY LEVEL <= REGEXP_COUNT (mystring, ',') + 1
AND PRIOR SYS_GUID () IS NOT NULL
AND r = PRIOR r)
GROUP BY str
ORDER BY 1Output:
STR COUNT(*)
ABC 2
DEF 2
GHI 1
JKL 2
MNO 2Cheers,
Manik. -
Powershell ADODB Recordset getstring comma separated
I am having problems with the getstring method of the Adodb.recordset object in Powershell
I wish to output a comma-separated string of a persisted recordset. I am not entirely sure the correct syntax for the getstring method
when I write the following
$objRecordset.Getstring(,,",",,)
I get the following error
Missing ')' in method call.
At :line:1 char:25
+ $objRecordset.Getstring(, <<<< ,",",,)
The full code is below
$adOpenStatic = 3
$adLockOptimistic = 3
$objRecordset = New-Object -comobject ADODB.Recordset
## where Modeldata.rs is recordset save to ADTG file
$objRecordset.Open("Modeldata.rs" , "Provider=MSPersist",$adOpenStatic,$adLockOptimistic)$objRecordset.MoveFirst()
## outputs a tab delimited string by default
$objRecordset.Getstring()
## output a comma delimited string
$objRecordset.Getstring(,,",",,)
## returns the following error
##Missing ')' in method call.
##At :line:1 char:25
##+ $objRecordset.Getstring(, <<<< ,",",,)
$objRecordset.Close()
Can you please help?
If this is not possible, is there a suitable workaround?Thanks, jrv. That set me on the right track. I discovered also that I needed to enter a value for the second parameter (NumRows)
as well. To return all records, I need to enter -1.
$objRecordset.Getstring(2,-1,",")
Maybe you are looking for
-
If I buy a brand new MacBook Air it will come with Maverick OS. I like Mountain Lion, Can install Mountain Lion my self? would that generate any problem? Thanks
-
Lightroom Profiles for Lumix GX7?
I'm trying out various programs for RAW processing using my new Lumix GX7. I quite like DXO Optics Pro 9 due to the camera and lens profiles for my equipment. However, it has limited functionality compared to Lightroom 5.6 which I'm also trying. I no
-
Hi there, The scanner on my printer Hp6520 has stopped working? It was fine yesterday however today it says try later? It is connected to the internet and all the other funtions are working ie, print from computer, photocopy. Please help!
-
my phone freeze when i use the fm transmitter...... after finish 1 song.... my phone freeze...... cannot switch to other song...... help.....
-
2010 server in Dag config. need to move logs
I have 2 EX 2010 servers in a dag. 1 of the servers needs a bigger drive for the logs Can anyone comment on my plan to move these logs currently the logs for both servers are sitting on the I drive on each I was hoping I could 1) stop mail services o