我有一条SQL 语句,select * from msg where msg_id in (````````)
括号里的的msg_id有4000条(过长),执行这样的SQL的话,会出错。请问一下,如果我想SQL不变,要怎样才能不出错呢
括号里的的msg_id有4000条(过长),执行这样的SQL的话,会出错。请问一下,如果我想SQL不变,要怎样才能不出错呢
解决方案 »
- 硬件监控
- oracle数据库保存fcketitor编辑控件为clob字段出错
- 创建用户表时出现ORA-01950错误提示
- Oralce错误:ORA-01033: ORACLE initialization or shutdown in progress
- 一个关于数据组合的SQL算法
- 这个group by 语句怎么写?是不是要用procedure.
- 不能启动Oracle,请帮忙!
- 一个很大的表删除记录后没有回收空间
- 导入数据库错误,提示无法转换字符集*(865-852)。。急!!!!
- 请问ASP通过ADO调用ORACLE数据库时不能用ADDNEW和UPDATE来新增数据是什么问题?
- 这种sql怎么写~请高手指点
- oracle中有没有判断某一字符串为正确的日期型数据的函数
此中使用循环,每次执行300个(最大1000个参数)msg_id。
返回记录集。
as
begin
open out_var for select * from msg where msg_id in (````````);
close out_var;
open out_var for select * from msg where msg_id in (````````);
close out_var;
......
end;
/
--这样也不行吗?grant create any procedure to userA;
select * from msg where msg_id in ('id2',......) union
...... --每行使用500个msg_id
;
最重新的是exists比not in和in速度快得多,因为not in和in查询每一笔数据要扫描全表,而exists只扫描与当前条件匹配的内容
(select column_name as fid from table(传一个数组)) b
where a.fid=b.fid
这个办法效率高,而且随便你多少长,我们就是这样用的
这个思路是对的,但是一个对象只能传999个参数,也存在限制create or replace type xtype is table of varchar2(200);select * from table(cast xtype('1', '2'/*这里只能有999个,限制了 */) as xtype);
--摘自asktom
--str2tbl, 将逗号分隔的字符串转成表
--考虑:写成piple row函数,可优化性能create or replace type str2tblType as table of varchar2(30);
/create or replace
function str2tbl( p_str in varchar2, p_delim in varchar2 default ',' )
return str2tblType
as
l_str long default p_str || p_delim;
l_n number;
l_data str2tblType := str2tbltype();
begin
dbms_application_info.set_client_info( userenv('client_info')+1 );
loop
l_n := instr( l_str, p_delim );
exit when (nvl(l_n,0) = 0);
l_data.extend;
l_data(l_data.count) := ( ltrim(rtrim(substr(l_str,1,l_n-1))) );
l_str := substr( l_str, l_n+1 );
end loop;
return l_data;
end;
/select *
from TABLE(cast( str2tbl( '1,2,3,4,5' ) as str2tblType) ) t
/
from emp
where ename in
(
select *
from table(cast(str2tbl('1,2,3,还有很长长') as str2tblType))
)--以 scott登录进行的测试, ok. (不知道楼主的代码,又会不会遇到字符串过长的问题, ^.^)
select *
from emp
where ename in (
select * from table( cast(str2tbl(rpad('5', 5001, ',5')) as str2tblType))
)
见意用exists代替in吧