`
flash7783
  • 浏览: 309403 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

参考游标(refcursor)的使用

阅读更多

参考游标(refcursor)的使用

我们知道在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();
}
}

分享到:
评论

相关推荐

    ORACLE显式游标和动态游标的使用.pdf

    - 定义动态游标使用`TYPE`声明,例如:`TYPE ref_cursor_name IS REF CURSOR;` - 打开动态游标使用`OPEN FOR`语句,例如:`OPEN cursor_name FOR select_statement;` - 从动态游标中读取数据与显式游标相同,使用...

    增量光标:此功能允许您使用Matlab的内置数据光标来拥有增量光标。-matlab开发

    所有其他游标都使用相对于参考游标的增量进行更新。 创建图形时,datacursormode 'UpdateFcn' 被自定义更新函数覆盖,该函数执行所有增量功能。 注意:有时会出现一个小故障。 参考光标的 dX、dY 和 dZ 将为 0,而...

    java调用oracle存储过程返回结果集,Record,cursor.[参考].pdf

    - `TESTPACKAGE` 包含了一个名为`type_cursor`的Ref Cursor类型变量,用于存储返回的游标。 3. **创建Procedure**: - `test_items` 这个过程接收一个`OUT`参数`MyTable`,类型为`TESTPACKAGE.type_cursor`。在这...

    ORACLE中游标的使用.pdf

    声明游标时,使用`CURSOR`关键字,指定一个查询语句,例如: ```sql CURSOR c_emp IS SELECT empno, ename, salary FROM emp WHERE salary > 2000; ``` 这个例子声明了一个名为`c_emp`的游标,它对应于查询所有薪水...

    PL/SQL 基础.doc

    3) 参考型:REF CURSOR(游标)、REF object_type 4) LOB(Large Object) 2. %TYPE [变量名] [表名.字段名] [%TYPE] 表示变量具有与数据库的表中某一字段相同的类型 例:v_FirstName s_emp.first_name%TYPE;...

    关于oracle的PLSQL用户指南与参考

    TYPE ref_cur IS REF CURSOR; v_cur ref_cur; BEGIN OPEN v_cur FOR SELECT * FROM employees; -- 使用v_cur END; ``` **6. 属性** - **定义**: 属性提供了游标的状态信息。 - **常见属性**: - `%ISOPEN`...

    ORACLE数据库使用动态SQL的方法.pdf

    cursor_name SYS_REFCURSOR; BEGIN stmt := 'SELECT * FROM table WHERE column = :1'; PREPARE sql_statement FROM stmt; EXECUTE sql_statement USING bind_value; OPEN cursor_name FOR stmt USING bind_...

    编程规范思想

    - rc_:表示RefCursor名 - type_:表示用户定义的类型名 4. 书写规范: - 大小写风格:Oracle的保留字大写,其余小写。 - 缩进风格:统一使用2个空格进行缩进,以保证风格的一致性,避免使用TAB键。 - 空格及...

    PL/SQL用户指南与参考

    ### PL/SQL用户指南与参考知识点汇总 #### 第一章:PL/SQL一览 ##### 一、理解PL/SQL的主要特性 PL/SQL(Procedural Language for SQL)是一种过程化语言,它允许用户在Oracle数据库环境中编写过程化代码块。这种...

    ODAC.9.0.1 ODAC.9.0.1 Full Source

    1. **ODAC组件核心功能**:ODAC支持Oracle的所有主要特性,如PL/SQL、BFILE、REF CURSOR、LOB、XMLType等。它还提供了对Oracle高级特性的支持,例如Oracle分布式事务处理、游标、触发器、存储过程、函数和类型。 2....

    PLSQL教學講義.doc

    参考数据类型(Reference Datatypes)如记录(RECORD)、指针(REF)和对象类型(OBJECT)提供了更复杂的数据表示。复合数据类型(Composite Datatypes)如数组(TABLE)和游标(CURSOR)允许存储多个值或数据集合。...

    Sybase to GP

    此外,可以使用`WITH`语句创建临时表,如`WITH t0 AS (query)`,以及通过`DECLARE v_cursor refcursor`声明和使用游标。 字符串拼接方面,Sybase中的`+`运算符在Greenplum中被`||`取代。`SELECT INTO`语句在...

    Oracle数据库基础面试题

    - **游标类型定义**:使用REF CURSOR类型定义返回的数据集。 - **实现步骤**: 1. **获取总记录数**:使用SQL查询获取总记录数。 2. **分页查询**:根据当前页码和每页记录数构建分页SQL语句。 3. **执行查询**:...

    Oracle 分页存储过程

    TYPE type_cur IS REF CURSOR; -- 定义游标类型 PROCEDURE Pagination ( Pindex IN NUMBER, -- 需要显示的页数,从0开始 Psql IN VARCHAR2, -- 分页查询的SQL语句 Psize IN NUMBER, -- 每页显示的记录数 ...

    Oracle Data Provider for .NET Developer's Guide 11g Release 2 (1

    4. **Oracle特定的功能**:如BFILE、LOB(大型对象)、REF CURSOR、ROWID等Oracle特有的数据类型和功能,ODP.NET提供了对应的.NET接口,使得开发者能够轻松操作这些特性。 5. **性能优化**:ODP.NET实现了Oracle ...

    超详细ORACLE培训带实例带书签目录

    - **复合数据类型**:如REF CURSOR、RECORD等。 #### 第十一章 Oracle体系结构(DBA) - **Oracle实例与数据库**:区分Oracle实例和数据库的概念。 - **内存结构**:SGA和PGA的组成及其作用。 - **后台进程**:PMON...

Global site tag (gtag.js) - Google Analytics