参考游标(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();
}
}
相关推荐
- 定义动态游标使用`TYPE`声明,例如:`TYPE ref_cursor_name IS REF CURSOR;` - 打开动态游标使用`OPEN FOR`语句,例如:`OPEN cursor_name FOR select_statement;` - 从动态游标中读取数据与显式游标相同,使用...
所有其他游标都使用相对于参考游标的增量进行更新。 创建图形时,datacursormode 'UpdateFcn' 被自定义更新函数覆盖,该函数执行所有增量功能。 注意:有时会出现一个小故障。 参考光标的 dX、dY 和 dZ 将为 0,而...
- `TESTPACKAGE` 包含了一个名为`type_cursor`的Ref Cursor类型变量,用于存储返回的游标。 3. **创建Procedure**: - `test_items` 这个过程接收一个`OUT`参数`MyTable`,类型为`TESTPACKAGE.type_cursor`。在这...
声明游标时,使用`CURSOR`关键字,指定一个查询语句,例如: ```sql CURSOR c_emp IS SELECT empno, ename, salary FROM emp WHERE salary > 2000; ``` 这个例子声明了一个名为`c_emp`的游标,它对应于查询所有薪水...
3) 参考型:REF CURSOR(游标)、REF object_type 4) LOB(Large Object) 2. %TYPE [变量名] [表名.字段名] [%TYPE] 表示变量具有与数据库的表中某一字段相同的类型 例:v_FirstName s_emp.first_name%TYPE;...
TYPE ref_cur IS REF CURSOR; v_cur ref_cur; BEGIN OPEN v_cur FOR SELECT * FROM employees; -- 使用v_cur END; ``` **6. 属性** - **定义**: 属性提供了游标的状态信息。 - **常见属性**: - `%ISOPEN`...
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(Procedural Language for SQL)是一种过程化语言,它允许用户在Oracle数据库环境中编写过程化代码块。这种...
1. **ODAC组件核心功能**:ODAC支持Oracle的所有主要特性,如PL/SQL、BFILE、REF CURSOR、LOB、XMLType等。它还提供了对Oracle高级特性的支持,例如Oracle分布式事务处理、游标、触发器、存储过程、函数和类型。 2....
参考数据类型(Reference Datatypes)如记录(RECORD)、指针(REF)和对象类型(OBJECT)提供了更复杂的数据表示。复合数据类型(Composite Datatypes)如数组(TABLE)和游标(CURSOR)允许存储多个值或数据集合。...
此外,可以使用`WITH`语句创建临时表,如`WITH t0 AS (query)`,以及通过`DECLARE v_cursor refcursor`声明和使用游标。 字符串拼接方面,Sybase中的`+`运算符在Greenplum中被`||`取代。`SELECT INTO`语句在...
- **游标类型定义**:使用REF CURSOR类型定义返回的数据集。 - **实现步骤**: 1. **获取总记录数**:使用SQL查询获取总记录数。 2. **分页查询**:根据当前页码和每页记录数构建分页SQL语句。 3. **执行查询**:...
TYPE type_cur IS REF CURSOR; -- 定义游标类型 PROCEDURE Pagination ( Pindex IN NUMBER, -- 需要显示的页数,从0开始 Psql IN VARCHAR2, -- 分页查询的SQL语句 Psize IN NUMBER, -- 每页显示的记录数 ...
4. **Oracle特定的功能**:如BFILE、LOB(大型对象)、REF CURSOR、ROWID等Oracle特有的数据类型和功能,ODP.NET提供了对应的.NET接口,使得开发者能够轻松操作这些特性。 5. **性能优化**:ODP.NET实现了Oracle ...
- **复合数据类型**:如REF CURSOR、RECORD等。 #### 第十一章 Oracle体系结构(DBA) - **Oracle实例与数据库**:区分Oracle实例和数据库的概念。 - **内存结构**:SGA和PGA的组成及其作用。 - **后台进程**:PMON...