最近在做一个批量查询,在参数表里取出参数,然后对每个参数查询主表,每个参数对应多个结果,只取前n行,把这些结果集合起来,返回。
最开始用的是一条语句查询,由于用不到索引,查询相当慢,所以改为用存储过程。
原来的语句
select t.*,(row_number() over (partition by t.col_name2 order by t.col_name3)) rn from (
select * from main_table
where col_name1 in ($params$) and $otherParams$
) where rn < #maxReturn#
现在改为用存储过程来做,遇到的问题:
1、otherparam是拼成的sql字符串,涉及多个字段(col1 = value or col2 = value or col3 = .....),如果先组装字符串再执行 open cursor for sqlString,sql不能包含 bulk collect into。
2、通过select col1,col2,col3 bulk into collect t_type_table from maintable where col1 = param1 查出结果,如何把一个参数查出的结果放到一个大的集合里,统一返回?
一部分代码:
create or replace function fun_query_batch(param_seq varchar2, otherParams varchar2, maxAmount number)
--返回类型,已创建 create or replace type xxx is object(col1 varchar(100), col2 varchar(1000) ...)
-- create or replace type res_type_table is table of xxx;
return res_type_table
is
--取出参数
cursor cursor_param is select t.col1 from param_table where t.seq = param_seq;
x param_table%rowtype;
res_table is type_res_table := type_res_table();
res_table_all is type_res_table := type_res_table();
begin
for x in cursor_param loop
--查询主表,如果加入otherParams就需要拼接字符串,这里暂不考虑
select tp_maintable(col1,col2,col3) bulk collect into res_table from (
select * from maintable where colName = x.col1 order by colName2
)where rownum <= maxAmount ;
dbms_output.put_line( res_table.count );
--如果查出数据,加入到总的集合里。(另外一种方式是插入到临时表里,然后统一取出,但是需要建临时表,还要再去查一次清理一次)
if p_table.count > 0 then
for i in p_table.first .. p_table.last loop
--这里应该怎么处理?
p_table_all.extend();
end loop;
end if;
end loop;
dbms_output.put_line( res_table_all.count );
dbms_output.put_line( res_table_all(1).colname );
return p_table_all;
end;
调用方式:
select * from table(fun_query_batch('seq','otherparam',10));
还有procedure方式的查询,返回游标,逻辑跟上面的差不多。
不管用什么方式,怎样实现这个批量查询的功能?
各位兄弟帮下忙!先谢谢了
相关推荐
利用游标返回结果集的的例子(Oracle 存储过程).doc 利用游标返回结果集的的例子(Oracle 存储过程).doc 利用游标返回结果集的的例子(Oracle 存储过程).doc
要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的结构: mysql> desc orders; +----------------+-------------+------+-----+---------+-------+ | Field | Type |...
学习之用,游标操作多个数据库 学习之用,游标操作多个数据库 学习之用,游标操作多个数据库
Oracle存储过程、游标、函数的详解
sql 存储过程常用函数及游标用法 这里包括 字符函数,数据库维护命令,所有游标的用法以及日期函数
MySQL实验报告5(存储过程与函数)(1)(1).pdf
oracle存储过程使用游标对多表操作例子
oracle 的函数、存储过程、游标、简单实例 oracle常用语句oracle 的函数、存储过程、游标、简单实例 oracle常用语句
存储过程中通过返回数据集,通过游标方式实现,以及在java中如何接收的整个过程
视图、存储过程、函数、游标与触发器、
、视图、存储过程、函数、游标与触发器、视图、存储过程、函数、游标与触发器
存储过程触发器 游标是数据库中的一个重要触发器,该篇讲述触发器详细,偏于广大学者学习参考。
语法入门、操作plsql、存储过程、函数、触发器、游标、包、返回类型;一个execle表轻松搞定。
SqlServer存储过程游标 ,一个例子
mysql函数、存储过程、触发器、游标
原创sql存储过程函数范例,一是为了自己方便查找,今天到公司因为没有我保存的一些范例,一个简单的例子写了半个小时,如果有范例直接套几分钟肯定搞定,所以索性上传到CSDN上,何时何地都能找到我的范例了。...
mysql存储过程 多个游标循环(依次执行,非嵌套循环)REPEAT循环。有需要的可自行下载。
Mysql存储过程游标触发器
关键字:事物、游标、存储过程、触发器引言:在关系数据库系统中,事务指的是组成为独立单元的一个或多个SQL操作的可恢复的序列。对数据库的任何一次读或写都是在某次事务内完成的。游标类似一个指针,指向某一个...
实验八数据库编程技术——游标、存储过程与触发器.pdf