解决方案 »
- oracle job相关问题
- oracle以前的数据怎么导入到现在的oracle中
- 编程语言总汇,让你受益无穷!!!
- SQL如何产生一组总和固定的随机数?
- varchar2(50)字段写入中文数据,报错是为什么
- LOOP 中出现异常后怎么继续执行循环,执行下一条记录 ,
- 如何简化启动oracle8i的服务,加快启动时间最大程度降低消耗内存,在线等!
- 百分:有什么办法可以直接写SP或SF来设置SEQUENCE的NEXTVAL?
- 怎样在where 条件里比较时间
- 如何判断一个表是否正在被别人使用,或者已经被其他人锁定?
- oracle 语句 截取之后有重复的 怎么去除重复的值
- 请教一个较复杂的SQL问题。
另外,第一个while检测,最好不要循环去做,而是利用sql一次搞定。这里给个参考:--自定义数组,用来保存输入的字符串分隔后的数据
create or replace type numTableType as table of number
/ --这个是把输入的字符串用,分开生成数组的,你可以把,改成;
create or replace function str2numList(
p_string in varchar2
) return numTableType
as
v_str long default p_string || ','; --输入为'1,2,3,4',在这里变为'1,2,3,4,'以便下面的循环进行分隔
v_n number;
v_data numTableType := numTableType();
begin
loop
v_n := to_number(instr( v_str, ',' ));
exit when (nvl(v_n,0) = 0);
v_data.extend;
v_data(v_data.count) := ltrim(rtrim(substr(v_str,1,v_n-1)));
v_str := substr(v_str, v_n+1);
end loop;
return v_data;
end;
/create or replace procedure proc_get_favorite(
in_session_key IN dat_ct_user_session.session_key%TYPE,
in_series_id_lst IN varchar2,
in_resolution IN dat_ct_series_status.resolution%TYPE,
out_cr_favorite OUT SYS_REFCURSOR,
out_flag OUT number
)
AS
begin
update dat_ct_user_session set last_access_time = SYSTIMESTAMP where session_key = in_session_key; if SQL%NOTFOUND then
out_flag := -1;
else
open out_cr_favorite for
select ss.series_id,s.series_name,ss.max_chapter_no,ss.end_status from dat_ct_series s,dat_ct_series_status ss
where s.series_id = ss.series_id
and s.status = 'A'
and ss.resolution = in_resolution
and ss.series_id in( --关键是这里,把输入的字符串分隔以后形成一个数组,然后把数组当作表来用。你那里可以这样做,然后利用一个sql来判断是否是同一个城市的客户。
select * from
THE (select cast(str2numList(in_series_id_lst) as numtableType) from dual)
)
order by s.init_letter,s.series_name;
out_flag := 0;
end if; Exception when others then
raise;
end proc_get_favorite;
/
如果in的参数分别对应10个以内,100个的话