oracle游标的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle游标的使用相关的知识,希望对你有一定的参考价值。

①创建一个包,在该包中定义类型test_cursor是个游标
Create or replace package tespackage as
Type test_cursor is ref cursor;
End tespackage;
① 创建过程:
Create or replace procedure sp_pro10
(spno in number,p_cursor out tespackage.test_cursor) is
Begin
Open p_cursor for select * from emp where deptno=spno;
End sp_pro10;
如何在sqlplus中调用此过程exec sp_pro10(?,?)第二个参数如何写呢?我想获取emp表中的部门号为10的所有记录。

参考技术A 你尝试一下, 使用 函数 来处理, 应该就可以避免掉 存储过程参数没法写的问题。

创建返回结果集的函数
SQL> create or replace package pkg_HelloWorld as
2 -- 定义ref cursor类型
3 type myrctype is ref cursor;
4 --函数申明
5 function getHelloWorld return myrctype;
6 end pkg_HelloWorld;
7 /

程序包已创建。

SQL> CREATE OR REPLACE package body pkg_HelloWorld as
2 function getHelloWorld return myrctype
3 IS
4 return_cursor myrctype;
5 BEGIN
6 OPEN return_cursor FOR
7 SELECT 'Hello 1' AS a, 'World 1' AS B FROM dual
8 UNION ALL
9 SELECT 'Hello 2' AS a, 'World 2' AS B FROM dual;
10 return return_cursor;
11 END getHelloWorld;
12 end pkg_HelloWorld;
13 /

程序包体已创建。

注:Oracle 这里的函数,是一个返回游标类型的函数, 不是像 SQL Server 的那种叫 “表值函数” 的东西。
因此下面的写法会报错。
SQL> SELECT * FROM pkg_HelloWorld.getHelloWorld();
SELECT * FROM pkg_HelloWorld.getHelloWorld()
*
第 1 行出现错误:
ORA-00933: SQL 命令未正确结束

SQL> SELECT pkg_HelloWorld.getHelloWorld() FROM dual;
PKG_HELLOWORLD.GETHE
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1
A B
------- -------
Hello 1 World 1
Hello 2 World 2

C# 如何调用上面的 返回结果集的例子:

/// <summary>
/// 测试 调用 Oracle 返回结果集的函数.
/// </summary>
private void CallFuncWithTable(OracleConnection conn)

// 创建一个 Command.
OracleCommand testCommand = conn.CreateCommand();

// 定义需要执行的SQL语句. testCommand.CommandText = "pkg_HelloWorld.getHelloWorld";
// 定义好,本次执行的类型,是存储过程. testCommand.CommandType = CommandType.StoredProcedure;
// 定义好,我这个参数,是 游标 + 返回值.
OracleParameter para = new OracleParameter("c", OracleType.Cursor);
para.Direction = ParameterDirection.ReturnValue;
testCommand.Parameters.Add(para);

// 执行SQL命令,结果存储到Reader中.
OracleDataReader testReader = testCommand.ExecuteReader();

// 处理检索出来的每一条数据.
while (testReader.Read())

// 将检索出来的数据,输出到屏幕上.
Console.WriteLine("调用函数:0; 返回:1 - 2",
testCommand.CommandText, testReader[0], testReader[1]
);


// 关闭Reader.
testReader.Close();
参考技术B 第二个参数声明一个 ref 游标作为参数传进去,存储过程执行完毕以后,直接读取该游标的内容就行了
declare
cur testpackage.test_cursor;
rt_emp rowtype%emp;
begin
sp_pro10(10, cur);
fetch cur into rt_emp;
exit when cur%notfound;
-- 做你的操作
end;

以上是关于oracle游标的使用的主要内容,如果未能解决你的问题,请参考以下文章

oracle中游标的使用?

oracle游标怎么使用?创建完了 怎么用?

oracle游标的使用

oracle 游标是做啥用的

oracle如何关闭游标?

ibatis 怎么返回oracle游标