我们知道在sql server中可以直接在存储过程中使用select * from 来产生记录集,但在oracle的存储过程里却不可以。怎么办呢?可以用参考游标来实现。
参考游标(ref cursor)从Oracle 7.3开始引入,作用是允许在存储过程,函数,包中返回记录集。
在Oracle 9i之前,参考游标以如下方式定义:
首先定义一个参考游标:
TYPE ref_type_name IS REF CURSOR
[RETURN {cursor_name%ROWTYPE
|ref_cursor_name%ROWTYPE
|record_name%TYPE
|record_type_name
|table_name%ROWTYPE} ];
如:
CREATE OR REPLACE PACKAGE Types AS
TYPE cursor_type IS REF CURSOR;
END Types;
/
然后在存储过程中引用这个游标:
CREATE OR REPLACE
PROCEDURE GetEmpRS (p_deptno IN emp.deptno%TYPE,
p_recordset OUT Types.cursor_type) AS
BEGIN
OPEN p_recordset FOR
SELECT ename,
empno,
deptno
FROM emp
WHERE deptno = p_deptno
ORDER BY ename;
END GetEmpRS;
/
Oracle 9i及以后版本,可省略第一步的定义,用sys_refcursor来代替:
CREATE OR REPLACE
PROCEDURE GetEmpRS (p_deptno IN emp.deptno%TYPE,
p_recordset OUTsys_refcursor) AS
BEGIN
OPEN p_recordset FOR
SELECT ename,
empno,
deptno
FROM emp
WHERE deptno = p_deptno
ORDER BY ename;
END GetEmpRS;
/
在程序中如何调用呢?
ADO中:
Dim conn, cmd, rs
Set conn = Server.CreateObject(”adodb.connection”)
conn.Open “DSN=TSH1;UID=scott;PWD=tiger”
Set cmd = Server.CreateObject (”ADODB.Command”)
Set cmd.ActiveConnection = conn
cmd.CommandText = “GetEmpRS”
cmd.CommandType = 4 ‘adCmdStoredProc
Dim param1
Set param1 = cmd.CreateParameter (”deptno”, adInteger, adParamInput)
cmd.Parameters.Append param1
param1.Value = 30
Set rs = cmd.Execute
Do Until rs.BOF Or rs.EOF
- Do something
rs.MoveNext
Loop
rs.Close
conn.Close
Set rs = nothing
Set param1 = nothing
Set cmd = nothing
Set conn = nothing
Java中:
import java.sql.*;
import oracle.jdbc.*;
public class TestResultSet {
public TestResultSet() {
try {
DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
Connection conn = DriverManager.getConnection(”jdbc:oracle:oci:@w2k1″, “scott”, “tiger”);
CallableStatement stmt = conn.prepareCall(”BEGIN GetEmpRS(?, ?); END;”);
stmt.setInt(1, 30); // DEPTNO
stmt.registerOutParameter(2, OracleTypes.CURSOR); //REF CURSOR
stmt.execute();
ResultSet rs = ((OracleCallableStatement)stmt).getCursor(2);
while (rs.next()) {
System.out.println(rs.getString(”ename”) + “:” + rs.getString(”empno”) + “:” + rs.getString(”deptno”));
}
rs.close();
rs = null;
stmt.close();
stmt = null;
conn.close();
conn = null;
}
catch (SQLException e) {
System.out.println(e.getLocalizedMessage());
}
}
public static void main (String[] args) {
new TestResultSet();
}
}
相关推荐
一、SQL server 游标的简单使用 一个对表进行操作的T-SQL语句通常都可产生或处理一组记录,但是许多应用程序,尤其是T-SQL嵌入的主语言,通常不能把整个结果集作为一个单元来处理,这些应用程序就需要用一种机制来...
定义了一个游标,使用declare 游标名 cursor for 来定义游标,该处查询用户表里的用户名, 存储过程处理完成后,游标就消失(因为它局限于存储过程)
游标卡尺的使用.ppt
游标卡尺的使用说明游标卡尺的使用说明游标卡尺的使用说明
游标卡尺的使用及读数教学设计zip,游标卡尺的使用及读数教学设计
PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 ...
什么是游标?游标有什么作用?Oracle游标的类型?Oracle游标的状态有哪些,怎么使用游标属性?如何使用显示游标,?如何遍历循环游标?
SQL游标原理和使用方法.docSQL游标原理和使用方法.doc
oracle笔记游标的使用,游标的详细代码案例,游标知识点笔记!
SQL游标原理和使用方法,适合新老手使用
游标的使用 游标的使用 游标的使用 游标的使用 游标的使用 不会可以联系我
说实的,使用MS SQL Server这样久,游标一直没有使用过。以前实现相似的功能,都是使用WHILE循环加临时表来实现。刚才有参考网上示例练习写了一下。了解到游标概念与语法。 下面代码示例中, 先是宣告你在游标中需...
螺旋测微器和游标卡尺的使用,请放心使用!
你也在为LatchFree、Librarycache争用那些事头疼吗,快来看看本文作者是怎么解决的。
本文详细的描述了游标卡尺的使用方法,图文并茂。比较详细,值得一看。
ORACLE 游标使用示例,给大家可以共享一下。
学会了里边的东西 基本上你就算出师了 SQL经典游标使用方法SQL经典游标使用方法
11-3--游标Cursor1
Oracle游标的一般使用
SQLServer 存储过程 游标的使用方法 事务的使用方法