存储过程条件用in,穿参数进去 查不到数据

lujianweisa 2011-07-19 02:34:08
oracle存储过程 声明了个游标。查询语句
select * from table where 姓名 in(joblist)

joblist 是varchar2参数 传进来的 是 '张三','李四','王五'

为什么测试跟踪 查不到数据呢。 sql语句直接查可以查到数据的啊。
存储过程里条件用in+参数 有啥说法么···
...全文
538 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wallace_jjh 2011-07-19
  • 打赏
  • 举报
回复
用instr也可以实现

select * from table where INSERT(joblist, '''' || 姓名 || '''') > 0
Well 2011-07-19
  • 打赏
  • 举报
回复
不支持,需要用动态sql语句。。。
renfengjun 2011-07-19
  • 打赏
  • 举报
回复
上面是分割字符串的。和9楼答案配合使用。
renfengjun 2011-07-19
  • 打赏
  • 举报
回复

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'

你试试。
BenChiM888 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lujianweisa 的回复:]
恩··因为是要对这个普通的游标数据进行复杂的操作后存到临时表里。我在研究研究 3q
[/Quote]

那你完全可以用,sys_refcursor 类型的游标进行逻辑处理,游标变量也是可以fetch的。


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;

lujianweisa 2011-07-19
  • 打赏
  • 举报
回复
恩··因为是要对这个普通的游标数据进行复杂的操作后存到临时表里。我在研究研究 3q[Quote=引用 7 楼 benchim888 的回复:]
SQL code

--普通游标无法用动态sql,向临时表里面插入数据为什么用游标呢?
--下面这样不行么。
execute immediate 'insert into table_name select * from xx in('||i_str||')';
[/Quote]
BenChiM888 2011-07-19
  • 打赏
  • 举报
回复

--普通游标无法用动态sql,向临时表里面插入数据为什么用游标呢?
--下面这样不行么。
execute immediate 'insert into table_name select * from xx in('||i_str||')';

lujianweisa 2011-07-19
  • 打赏
  • 举报
回复
你好,我这边是 这样
declare
cursor cur_stu is
select * from xx in (i_str);
然后下边对这个游标循环操作到一个临时表里,最后才用sys_refcursor参数返回
这里没办法像你那样写啊
[Quote=引用 5 楼 benchim888 的回复:]
SQL code

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……
[/Quote]
BenChiM888 2011-07-19
  • 打赏
  • 举报
回复

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;
lujianweisa 2011-07-19
  • 打赏
  • 举报
回复
传入数组的话 可不可以呢 oracle还会当做 一个整串么
lujianweisa 2011-07-19
  • 打赏
  • 举报
回复
oracle原来这样啊。这个字符串可能会比较长。请问稍微具体点用动态sql或者instr函数该如何处理呢。需要拆分这个字符串然后循环么[Quote=引用 1 楼 hudingchen 的回复:]
你现在这种写法,参数'张三','李四','王五'传递到存储过程中,oracle会把它看成一个字符串,
相当于:select * from xx in (' ''张三'',''李四'',''王五'' ')

可以使用动态sql或者instr来处理。
[/Quote]
BenChiM888 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hudingchen 的回复:]
你现在这种写法,参数'张三','李四','王五'传递到存储过程中,oracle会把它看成一个字符串,
相当于:select * from xx in (' ''张三'',''李四'',''王五'' ')

可以使用动态sql或者instr来处理。
[/Quote]

+1
hudingchen 2011-07-19
  • 打赏
  • 举报
回复
你现在这种写法,参数'张三','李四','王五'传递到存储过程中,oracle会把它看成一个字符串,
相当于:select * from xx in (' ''张三'',''李四'',''王五'' ')

可以使用动态sql或者instr来处理。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧