前面我们已经讨论了如何声明存储过程的返回结果集。这里我们讨论一下结果集返回类型的问题。结果集的返回类型有两种:调用者(CALLER) 和客户应用(CLIENT)。首先我们看一下声明这两种游标的例子:
CREATE PROCEDURE getPeople(IN piAge INTEGER)
DYNAMIC RESULT SETS 2
READS SQL DATA
LANGUAGE SQL
BEGIN
DECLARE rs1 CURSOR WITH RETURN TO CLIENT FOR
SELECT name, age FROM person
WHERE age<piAge;
DECLARE rs2 CURSOR WITH RETURN TO CALLER FOR
SELECT NAME, age FROM person
WHERE age>piAge;
OPEN rs1;
OPEN rs2;
END
代码中rs1游标的DECLAER语句中包含WITH RETURN TO CLIENT子句,表示结果集返回给客户应用(CLIENT)。rs2游标的DECLARE语句中包含WITH RETURN TO CALLER子句,表示结果集返回给调用者(CALLER)。
游标返回给调用者(CALLER)表示由存储过程的调用者接收结果集,而不考虑调用者是否是另一个存储过程,还是客户应用。图(1)中存储过程PROZ如果声明为WITH RETURN TO CALLER,那么结果集会返回给存储过程PROY,Client Application是不会得到PROZ返回的结果集的。
游标返回给客户应用(CLIENT)表示由发出最初 CALL 语句的客户应用接收结果集,即使结果集由嵌套层次中的 15 层深的嵌套存储过程发出也是如此。图1中存储过程 PROZ 如果声明为 WITH RETURN TO CLIENT,那么结果集会返回给 Client Application。返回给客户应用(CLIENT)的游标声明是我们经常使用的,也是默认的结果集类型。
在声明返回类型时,我们要认真考虑一下,我们需要把结果集返回给谁,以免丢失返回集,导致程序错误。
例一:
CREATE PROCEDURE "ARS"."TEST_CURSOR"
(
OUT "O_MSG" VARCHAR(500)
)
SPECIFIC "ARS"."TEST_CURSOR"
LANGUAGE SQL
NOT DETERMINISTIC
CALLED ON NULL INPUT
EXTERNAL ACTION
OLD SAVEPOINT LEVEL
MODIFIES SQL DATA
INHERIT SPECIAL REGISTERS
begin
declare i int default 1;
for v_cur as select * from test_cursor
do
update ars.test_cursor a set score=v_cur.score+1 where a.score=v_cur.score ;
end for;
set o_msg='执行成功';
end;
例二:
CREATE PROCEDURE "ARS"."TEST_CURSOR1"
(
OUT "O_MSG" VARCHAR(500)
)
SPECIFIC "ARS"."TEST_CURSOR"
LANGUAGE SQL
NOT DETERMINISTIC
CALLED ON NULL INPUT
EXTERNAL ACTION
OLD SAVEPOINT LEVEL
MODIFIES SQL DATA
DYNAMIC RESULT SETS 2
INHERIT SPECIAL REGISTERS
begin
declare v_cur cursor with return to caller for
select * from ars.test_cursor;
open v_cur;
set o_msg='执行成功';
end;
例三:
分享到:
相关推荐
游标及存储过程 通过判断微信号是否存在执行不同的操作
在Java编程中,有时我们需要调用Oracle数据库的存储过程,特别是当存储过程返回一个游标(Cursor)时,这种情况在处理大量数据或者分页查询时很常见。游标允许我们逐行处理结果集,而无需一次性加载所有数据,这对于...
Java调用Oracle存储过程返回结果集Record、Cursor参照 Java调用Oracle存储过程返回结果集(Record)是指在Java程序中通过调用Oracle存储过程来获取记录集的结果。下面将详细介绍相关知识点。 创建Type 在Oracle中...
PL/SQL Developer 调试存储过程及调试包中创建的存储过程 PL/SQL Developer 调试存储过程是指使用 PL/SQL Developer 工具来调试 Oracle 数据库中的存储过程。调试存储过程可以帮助开发者快速地定位和解决存储过程...
而REF CURSOR则是PL/SQL(Oracle数据库的存储过程语言)中的一个概念,它相当于一个指向结果集的指针,可以在PL/SQL中动态打开和关闭。 在Oracle9i之前的版本,直接从Java存储过程返回ResultSet是不被支持的,因为...
这里的`user_account_proc1`是一个返回游标的存储过程,它通过输出参数`my_cursor`返回结果集。 #### 总结 通过上述步骤,我们可以看到在iBatis中调用存储过程并返回游标的基本流程。首先定义参数映射和结果映射,...
而`SYS_REFCURSOR`是Oracle提供的一种特殊类型,它允许存储过程动态地打开一个游标(即结果集)并将其作为`OUT`参数返回。 以下是一个简单的存储过程示例,它打开一个游标并返回包含`employees`表所有列的结果集: ...
DB2数据库存储过程是数据库管理系统中一种非常重要的功能,它允许开发者编写一组SQL语句,封装成一个可重用的程序单元。存储过程可以提高应用程序的性能,减少网络流量,并提供更好的安全性和可维护性。以下是对DB2...
当存储过程被调用时,它可以在内部执行SQL查询,并将结果存储在一个Ref Cursor中,然后将这个Ref Cursor作为输出参数返回给调用者。 #### 三、创建存储过程返回结果集 ##### 1. 过程返回记录集 下面是一个简单的...
这里,我们使用了pymysql的cursor.callproc方法来调用存储过程,并获取返回的结果。`cursor.lastrowid`用来获取存储过程返回的最后一个值,即总行数。 总结来说,MySQL的分页存储过程提供了一种高效、可复用的方式...
以下是一个简单的存储过程示例,名为`TEST`,它接收两个输入参数`arg1`和`arg2`,并返回一个sys_refcursor类型的输出参数`v_out_result`: ```sql CREATE OR REPLACE PROCEDURE TEST (arg1 IN VARCHAR2, arg2 IN ...
Oracle数据库则是企业级应用中常见的关系型数据库,存储过程是其提供的一种强大功能,允许开发者编写复杂的SQL逻辑并进行封装。本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理...
存储过程可以使用游标(CURSOR)处理多行结果集。游标允许按行读取结果集,常用于循环处理数据。 十、存储过程的优化 1. 减少数据库往返:通过批处理操作,减少网络传输。 2. 使用绑定变量:避免SQL语句硬解析,...
深入学习存储过程,首先要理解其基本概念。存储过程是数据库管理系统中预编译的SQL语句集合,它允许开发者封装一系列复杂的查询和操作,形成一个可重复使用的代码单元。在SQL Server中,存储过程可以通过`CREATE ...
Oracle存储过程语法 Oracle存储过程语法是指在Oracle数据库中创建和管理存储过程的语法规则。存储过程是一种可以重复使用的数据库对象,旨在将多个SQL语句组合成一个单元,以便实现复杂的业务逻辑。 创建存储过程...
### 存储过程初学实例知识点详解 #### 一、存储过程概述 存储过程是一种预编译的SQL语句集合,它可以作为一个独立的数据库对象,也可以被用户的应用程序调用以实现特定的功能。存储过程支持参数输入输出、返回单个...
例如,可以创建一个包`TEST_PACKAGE`,其中包含一个类型`Test_CURSOR`作为游标的引用,以及一个存储过程`TESTC`,该过程使用这个游标返回结果集。 ```sql CREATE OR REPLACE PACKAGE TESTPACKAGE AS TYPE Test_...
MySQL 存储过程与函数 MySQL 存储过程和函数是数据库中定义的一组用户定义的 SQL 语句集合。它们之间的区别在于: 1. 存储过程实现的功能要复杂一点,而函数实现的功能针对性比较强。 2. 存储过程可以返回参数,而...
DB2 SQL存储过程基础 DB2 存储过程是指在 DB2 服务器端编写、执行的程序单元,可以实现业务逻辑、数据处理和事务控制等功能。存储过程是一种特殊的数据库对象,能够接受输入参数、执行复杂的业务逻辑、返回结果集等...
如果存储过程返回一个结果集,我们可以使用游标(Cursor)来处理。在MyBatis中,可以声明一个方法,其返回类型为Map或自定义的Java Bean,代表存储过程的输出参数。在XML配置中,使用`<select>`标签并设置`...