oracle存储过程 声明了个游标。查询语句
select * from table where 姓名 in(joblist) joblist 是varchar2参数 传进来的 是 '张三','李四','王五'为什么测试跟踪 查不到数据呢。 sql语句直接查可以查到数据的啊。
存储过程里条件用in+参数 有啥说法么···
select * from table where 姓名 in(joblist) joblist 是varchar2参数 传进来的 是 '张三','李四','王五'为什么测试跟踪 查不到数据呢。 sql语句直接查可以查到数据的啊。
存储过程里条件用in+参数 有啥说法么···
解决方案 »
- 求助。。同一条update语句,在VS2010中执行就报错“ORA-01036: 非法的变量名/编号”
- Oracle to_date函数问题
- oracle9i中的零值问题(急,在线等)
- Oracle date类型
- 请问以下SQL在方法内如何执行。谢谢
- 求SQL语句
- 如何快速删除数据库中所有表的数据而保留表结构?
- 急!我把机子A上面的一个库da放到B机子上去,我把da整个目录都移到机子B的 oradata目录下。但不能访问他了?
- [马上结贴]请问如何知道一个表或View的创建的时间?谢谢。
- 数据统计,涉及日期问题,请教!
- oracle10G一个用户指向了两个表空间。
- 求一个SQL语句,使某个字段值自动加1
相当于:select * from xx in (' ''张三'',''李四'',''王五'' ')可以使用动态sql或者instr来处理。
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;
declare
cursor cur_stu is
select * from xx in (i_str);
然后下边对这个游标循环操作到一个临时表里,最后才用sys_refcursor参数返回
这里没办法像你那样写啊
--普通游标无法用动态sql,向临时表里面插入数据为什么用游标呢?
--下面这样不行么。
execute immediate 'insert into table_name select * from xx in('||i_str||')';
那你完全可以用,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;
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'你试试。