0 0

难题:存储过程或函数,返回多个查询结果的集合,涉及到游标,集合操作等。5

最近在做一个批量查询,在参数表里取出参数,然后对每个参数查询主表,每个参数对应多个结果,只取前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方式的查询,返回游标,逻辑跟上面的差不多。

不管用什么方式,怎样实现这个批量查询的功能?

各位兄弟帮下忙!先谢谢了
2014年11月04日 18:46

1个答案 按时间排序 按投票排序

0 0

如何把一个参数查出的结果放到一个大的集合里,统一返回?
自定义一个 table ,在你检索完之后,new一个自定义的table,往里面放数据。然后返回就ok了。

2014年11月05日 13:01

相关推荐

    mysql存储过程之返回多个值的方法示例

    要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的结构: mysql&gt; desc orders; +----------------+-------------+------+-----+---------+-------+ | Field | Type |...

    Oracle存储过程、游标、函数的详解

    ### Oracle存储过程、游标、函数的详解 #### 一、概述 在Oracle数据库中,存储过程、游标和函数是非常重要的组成部分,它们为数据库管理提供了强大的编程能力。通过学习这些概念,我们可以更加灵活地管理和操作...

    MySQL实验报告5(存储过程与函数)(1)(1).pdf

    根据提供的文件内容,本篇实验报告主要围绕MySQL数据库中存储过程和函数的应用,涵盖了创建存储过程、函数、游标以及异常处理等高级特性。下面将详细解析报告中的每个知识点。 1. 创建存储过程 存储过程是一种在...

    sql 存储过程常用函数及游标用法

    在SQL中,存储过程是一种预编译的SQL语句集合,它可以封装一系列的数据库操作,提高数据处理效率,同时提供更好的安全性和可重用性。本文将深入探讨SQL存储过程中的常用函数、游标用法以及日期函数。 一、字符函数 ...

    oracle存储过程使用游标对多表操作例子

    在Oracle数据库中,存储过程是一种预编译的SQL代码块,可以接受参数、执行复杂的数据库操作并返回结果。它们提供了一种将业务逻辑封装在数据库内部的方法,从而提高应用程序的性能和安全性。本文将深入探讨如何在...

    Oracle存储过程out游标

    这段Java代码首先创建了一个CallableStatement对象,然后注册了Out参数(游标),执行存储过程,并从存储过程返回的结果集中读取数据。 总结一下,Oracle存储过程的Out游标是PL/SQL中返回多行结果的有效方式,Java...

    Orcale存储过程,游标,函数,简单易懂

    - 存储过程类似于 Java 中的方法或 C# 中的函数,可以接受输入参数、返回输出参数以及返回状态值。 2. **优点**: - **性能优化**:存储过程是预编译的,因此每次执行时不需要重新编译,从而提高了执行速度。 - ...

    游标操作多个数据库学习之用,游标操作多个数据库

    在进行游标操作之前,首先需要创建一个或多个数据库。示例代码中的数据库创建命令`CREATE DATABASE`用于定义新数据库的基本属性,如数据库名、数据文件的位置、大小及增长方式等。 ```sql CREATE DATABASE USER01 ...

    ORACLE存储过程,函数,包,游标

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的编程接口,其中存储过程、函数、包和游标是数据库开发中常用的重要元素。以下是对这些概念的详细解释和它们在实际应用中的作用。 ### 存储过程 ...

    利用游标返回结果集的的例子(Oracle 存储过程).doc

    2. 创建一个函数,通过游标返回查询结果。 3. 创建一个过程,接收一个游标参数并填充结果集。 4. 使用Java的JDBC API调用这些存储过程,处理返回的游标结果。 这种技术在需要在应用程序中分批处理大量数据或者需要...

    sql存储过程和游标的运用

    存储过程是一个预编译的SQL语句集合,它可以根据需要多次执行,以提高数据库的性能和安全性。存储过程可以接受输入参数,并根据这些参数返回结果。存储过程可以用来实现复杂的业务逻辑,例如计算平均成绩、统计成绩...

    jdbc调用存储过程,函数,游标

    在JDBC中,当你执行一个查询后,结果会被返回到ResultSet对象,这个对象就是一个游标。你可以通过移动游标来读取一行行的数据。例如,使用ResultSet的`next`方法来检查是否有下一行,然后使用`getString`, `getInt`...

    oracle 的函数、存储过程、游标、简单实例

    本主题将深入探讨Oracle中的几个核心概念:函数、存储过程、游标以及简单的实例,这些都是数据库管理员和开发人员日常工作中不可或缺的部分。 首先,我们来了解**Oracle函数**。函数是预定义的代码块,接受零个或多...

    oracle10g 函数返回游标类型

    随后,定义了一个函数`get`,该函数接受一个数字参数`Id`,并返回`re_data`类型的游标。 #### 函数实现细节 在`crazy_jia`包体中,`get`函数的实现主要包含以下步骤: 1. 定义局部变量`sqlstr`用于存储SQL查询语句...

    oracle存储过程、游标、函数

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的编程特性,如存储过程、游标和函数,使得数据库管理和数据处理更为高效。在这个主题中,我们将深入探讨这三个关键概念及其在实际应用中的作用。 **...

    oracle笔记(存储过程函数触发器游标流程控制等)

    这份"oracle笔记(存储过程函数触发器游标流程控制等)"涵盖了Oracle数据库管理中的关键知识点,包括但不限于以下几个方面: 1. **存储过程与函数**:存储过程是预编译的SQL语句集合,用于执行特定任务。它们可以提高...

    存储过程和游标

    在数据库管理领域,存储过程和游标是两个重要的概念,它们在数据操作和处理中扮演着不可或缺的角色。这里,我们将深入探讨这两个主题,以便更好地理解它们的功能、用途以及如何在实际开发中应用。 首先,存储过程...

    实验八数据库编程技术——游标、存储过程与触发器.pdf

    数据库编程技术——游标、存储过程与触发器 数据库编程技术是数据库管理系统中的一种重要技术,用于实现数据库的自动化管理和数据处理。本节实验重点介绍游标、存储过程和触发器三种数据库编程技术的应用。 一、...

    存储过程触发器 游标

    例如,在一个订单处理系统中,可以创建一个触发器,每当有新订单插入时,这个触发器会调用一个存储过程,该过程使用游标遍历订单的每一项商品,检查库存并更新相关记录。这样,系统可以自动跟踪库存变化,无需额外的...

    存储过程和游标详解

    存储过程是预编译的一系列SQL语句集合,存储在数据库中,并以一个特定的名字标识。当需要执行这些预定义的操作时,只需通过调用存储过程的名称,数据库就会自动执行其中的所有语句,无需再次编译,这大大提高了执行...

Global site tag (gtag.js) - Google Analytics