17,377
社区成员
发帖
与我相关
我的任务
分享
select * from table where INSERT(joblist, '''' || 姓名 || '''') > 0
CREATE OR REPLACE PACKAGE "PK_DEX_PUB" IS
TYPE T_VARCHAR_TABLE IS TABLE OF VARCHAR2(100);
/*
分隔字符串返回varchar数组(支持多字符分隔字符串)
STR 需要分隔字符串
SPLIT_STR 分隔字符串
*/
FUNCTION FUN_STR_SPLIT(STR IN VARCHAR2,SPLIT_STR VARCHAR2) RETURN VARCHAR2 ;
END PK_DEX_PUB;
/
CREATE OR REPLACE PACKAGE BODY "PK_DEX_PUB" IS
/*
分隔字符串返回varchar 数组
*/
FUNCTION FUN_STR_SPLIT(STR IN VARCHAR2,SPLIT_STR VARCHAR2) RETURN VARCHAR2 IS
V_STR VARCHAR2(1000); --源字符串
N_COUNT NUMBER:=0; --计数器(用做数组的下标)
LIS_STR T_VARCHAR_TABLE:=T_VARCHAR_TABLE(); --使用逗号分隔的字符串数组
N_INSTR NUMBER; --逗号所在的下标位置
V_SPLIT_STR VARCHAR2(100); --使用逗号截取后的字符串
V_RESULT VARCHAR2(2000) ;
BEGIN
V_STR:=STR;
LOOP
EXIT WHEN V_STR IS NULL;
BEGIN
N_INSTR:=INSTR(V_STR,SPLIT_STR);
V_SPLIT_STR:='';
IF N_INSTR=0 THEN --如果N_INSTR 逗号所在下标位置为0 表示为最后一个字符
V_SPLIT_STR:=TRIM(V_STR);
V_STR:='';
ELSE
V_SPLIT_STR:=TRIM(SUBSTR(V_STR,0,N_INSTR-1));
V_STR:=SUBSTR(V_STR,N_INSTR+LENGTH(SPLIT_STR));
END IF ;
IF LENGTH(V_SPLIT_STR)>0 THEN
N_COUNT:=N_COUNT+1;
LIS_STR.EXTEND;
LIS_STR(N_COUNT):=V_SPLIT_STR;
END IF;
END ;
END LOOP;
FOR I IN LIS_STR.FIRST .. LIS_STR.LAST LOOP
V_RESULT:=V_RESULT||CHR(39)||LIS_STR(I)||CHR(39)||',';
END LOOP;
IF V_RESULT IS NOT NULL THEN
V_RESULT := SUBSTR(V_RESULT,1,LENGTH(V_RESULT)-1) ;
END IF ;
RETURN V_RESULT;
END FUN_STR_SPLIT;
END PK_DEX_PUB;
SQL> SELECT PK_DEX_PUB.FUN_STR_SPLIT('FJSDLKFJSLD,FJKDLSJFL@FJDSKLMFL,JKFLDS','@') FROM DUAL ;
PK_DEX_PUB.FUN_STR_SPLIT('FJSD
--------------------------------------------------------------------------------
'FJSDLKFJSLD,FJKDLSJFL','FJDSKLMFL,JKFLDS'
open o_cursor for
'select * from xx in ('||i_str||')';
fetch o_cursor into xxx;
loop
exit when o_cursor%NODATA_FOUND then exit;
fetch o_cursor into xxx;
end loop;
close o_cursor;
--普通游标无法用动态sql,向临时表里面插入数据为什么用游标呢?
--下面这样不行么。
execute immediate 'insert into table_name select * from xx in('||i_str||')';
create or replace procedure procedure_name(
i_str varchar2,
o_cursor sys_refcursor
)as
begin
open o_cursor for
'select * from xx in ('||i_str||')';
exception
when others then
null;
end;