17,377
社区成员
发帖
与我相关
我的任务
分享
SELECT DECODE (INSTR (in_cid, ';', 1, 1),
0, in_cid,
SUBSTR (in_cid,
DECODE (ROWNUM,
1, 1,
INSTR (in_cid,
';',
1,
ROWNUM - 1
)
+ 1
),
DECODE (ROWNUM,
1, INSTR (in_cid, ';', 1, 1) - 1,
LENGTH (in_cid)
- LENGTH (REPLACE (in_cid,
';',
''
)
)
+ 1, LENGTH (in_cid),
INSTR (in_cid, ';', 1, ROWNUM)
- 1
- INSTR (in_cid,
';',
1,
ROWNUM - 1
)
)
)
) cid
FROM DUAL
CONNECT BY ROWNUM <=
LENGTH (in_cid)
- LENGTH (REPLACE (in_cid, ';', ''))
+ 1
CREATE OR REPLACE FUNCTION GET_STR(STR_IN VARCHAR2) RETURN VARCHAR2 IS
STR_OUT VARCHAR2(4000);
X VARCHAR2(5);
TYPE REFCURSOR IS REF CURSOR;
C_V REFCURSOR;
BEGIN
IF (LENGTH(STR_IN) - LENGTH(REPLACE(STR_IN, ',', ''))) > 999 THEN
RAISE_APPLICATION_ERROR(-20001, 'list too much,limited 1000!pls change it!');
ELSE
OPEN C_V FOR 'SELECT PID FROM TEST WHERE CID IN (' || STR_IN || ')';
LOOP
FETCH C_V
INTO X;
EXIT WHEN C_V%NOTFOUND;
IF LENGTH(STR_OUT) > 0 THEN
STR_OUT := STR_OUT || ',' || X;
ELSE
STR_OUT := X;
END IF;
END LOOP;
CLOSE C_V;
END IF;
RETURN STR_OUT;
END;
/
SELECT GET_STR('1,2,3') FROM dual;
返回结果:
10,20,30
Create Procedure Search
@s varchar
as
set @s1='select pid from select pid from test where cid in ('
declare @i int
while charindex(',',@s)=0
begin
set @s1=@s1+substring(@s,1,charindex(',',@s)-1)
set @s=substring(@s,1,charindex(',',@s)-1)
end
set @s1=@s1+')'
exec(@s1)
go
/* Formatted on 2008/07/17 15:47 (Formatter Plus v4.8.8) */
CREATE OR REPLACE FUNCTION fn_chk_pid (in_cid VARCHAR2)
RETURN VARCHAR2
IS
out_pid VARCHAR2 (4000);
BEGIN
SELECT wmsys.wm_concat (pid)
INTO out_pid
FROM TEST a,
(SELECT DECODE (INSTR (in_cid, ',', 1, 1),
0, in_cid,
SUBSTR (in_cid,
DECODE (ROWNUM,
1, 1,
INSTR (in_cid,
',',
1,
ROWNUM - 1
)
+ 1
),
DECODE (ROWNUM,
1, INSTR (in_cid, ',', 1, 1) - 1,
LENGTH (in_cid)
- LENGTH (REPLACE (in_cid,
',',
''
)
)
+ 1, LENGTH (in_cid),
INSTR (in_cid, ',', 1, ROWNUM)
- 1
- INSTR (in_cid,
',',
1,
ROWNUM - 1
)
)
)
) cid
FROM DUAL
CONNECT BY ROWNUM <=
LENGTH (in_cid)
- LENGTH (REPLACE (in_cid, ',', ''))
+ 1) b
WHERE a.cid = b.cid;
RETURN out_pid;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN OTHERS
THEN
-- Consider logging the error and then re-raise
NULL;
END fn_chk_pid;
SELECT TO_NUMBER
(DECODE
(LENGTH (in_promo_id),
6, in_promo_id,
SUBSTR
(in_promo_id,
DECODE
(ROWNUM,
1, 1,
INSTR
(in_promo_id,
',',
1,
ROWNUM - 1
)
+ 1
),
6
)
)
) promo_id
FROM DUAL
CONNECT BY ROWNUM <=
LENGTH (in_promo_id)
- LENGTH (REPLACE (in_promo_id,
',',
''
)
CREATE OR REPLACE FUNCTION fn_chk_pay (in_promo_id VARCHAR2)
RETURN VARCHAR2
IS
out_pay VARCHAR2 (200);
now_pay_num NUMBER (3);
limit_num NUMBER (3);
BEGIN
SELECT COUNT (*)
INTO now_pay_num
FROM tcode a
WHERE code_lgroup = 'J016'
AND use_yn = '1'
AND code_mgroup NOT IN ('50', '51');
SELECT wmsys.wm_concat (value_1), COUNT (*) num
INTO out_pay, limit_num
FROM (SELECT DISTINCT a.value_1
FROM tnew_promo_d a,
(SELECT TO_NUMBER
(DECODE
(LENGTH (in_promo_id),
6, in_promo_id,
SUBSTR
(in_promo_id,
DECODE
(ROWNUM,
1, 1,
INSTR
(in_promo_id,
',',
1,
ROWNUM - 1
)
+ 1
),
6
)
)
) promo_id
FROM DUAL
CONNECT BY ROWNUM <=
LENGTH (in_promo_id)
- LENGTH (REPLACE (in_promo_id,
',',
''
)
)
+ 1) b
WHERE a.data_type = 'B310'
AND a.data_gb = '10'
AND a.use_yn = '1'
AND a.promo_id = b.promo_id
ORDER BY 1);
RETURN out_pay;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN OTHERS
THEN
-- Consider logging the error and then re-raise
NULL;
END fn_chk_pay;
/