CREATE OR REPLACE PACKAGE GetRefCursors IS
-- ***********************************************************************
-- ** Author: Alf A. Pedersen www.databasedesign-resource.com
-- ** Version: : Apr. 10 2006
-- **
-- ***********************************************************************
-- ** General global cursor for all functions returning result sets.
TYPE csGetResultSet is REF CURSOR;
-- ***********************************************************************
-- ** Get all accounts for a given interval
-- ** In parameters:
-- ** First account
-- ** Last account
-- ** Returns:
-- ** Ref Cursor for the given account interval.
-- ***********************************************************************
function sfGetAccountInterval
( pFirstAccount in ACCOUNTS.ACCOUNT_NO%type
,pLastAccount in ACCOUNTS.ACCOUNT_NO%type)
return csGetResultSet;
end GetRefCursors;
/
CREATE OR REPLACE package body GetRefCursors is
-- ***********************************************************************
-- ** Author: Alf A. Pedersen www.databasedesign-resource.com
-- ** Version: : Apr. 10 2006
-- **
-- ***********************************************************************
-- ***********************************************************************
-- ** Get all accounts for a given interval
-- ** In parameters:
-- ** First account
-- ** Last account
-- ** Returns:
-- ** Ref Cursor for the given account interval.
-- ***********************************************************************
function sfGetAccountInterval
( pFirstAccount in ACCOUNTS.ACCOUNT_NO%type
,pLastAccount in ACCOUNTS.ACCOUNT_NO%type)
return csGetResultSet is
csGetAccounts csGetResultSet;
begin
open csGetAccounts for
SELECT accounts.account_no,accounts.name
FROM accounts
WHERE accounts.account_no BETWEEN pFirstAccount AND pLastAccount
ORDER BY accounts.account_no;
return csGetAccounts;
end sfGetAccountInterval;
end GetRefCursors;
/
The global cursour csGetResultSet has to be specified in the Package Specification, but is redirected to the local cursor csGetAccounts so it can be returned to the calling module from within that function.
This can be used as a template to build a framework for handling all SELECT access to your tables through such a mechanism. This way you will deliver a generic and consistent interface for all applications and/or modules that need to access data within your different tables.
Not to mention: The DBA can easily tune the various SELECT statements without even touching the application(s), no matter how many different modules that are accessing a given table.
Time saved, and secure, identical and (hopefully) error-free code is delivered to anyone from just one place.
If you need to learn how you can use a ref cursor in Oracle using Java, read here: Oracle ref cursor in Java
Other important resources on this site:
Oracle DBA
SQL Server DBA
Application Architecture
Software tools
Programming tips
Database fundamentals
Return from Ref cursor to Programming
分享到:
相关推荐
PL/SQL是Oracle数据库的一种高级编程语言,结合了SQL和过程编程,广泛应用于数据库管理、应用开发等领域。作为未来编程的重要形式,它提供了强大的功能,包括处理复杂的业务逻辑、数据操作以及事务控制。本文将深入...
根据给定文件的信息,我们可以深入探讨Oracle数据库中的PL/SQL(程序化SQL)语言的关键概念与用法。PL/SQL是Oracle数据库环境下的一个过程语言,它结合了SQL语句和传统的过程化语言特性,提供了强大的数据库编程能力...
在PL/SQL(Oracle的编程语言)中,存储过程不支持像T-SQL那样通过`SELECT * FROM table`来获取记录集,而是使用Ref Cursor(引用游标)来返回结果集。Ref Cursor是PL/SQL中的一个重要概念,它允许存储过程返回动态...
TYPE C_TYPE IS REF CURSOR; C1 C_TYPE; BEGIN OPEN C1 FOR 'SELECT * FROM EMP WHERE SALARY > :1' USING P_SALARY; LOOP FETCH C1 INTO R_EMP; EXIT WHEN C1%NOTFOUND; DBMS_OUTPUT.PUT_LINE('薪水大于 ' |...
### Oracle数据库技术——动态SQL详解 #### 一、动态SQL概述与应用场景 在Oracle数据库管理技术中,SQL语句按照其是否能在编译时确定,分为静态SQL与动态SQL两大类。静态SQL指的是那些在编写时就已经确定下来的SQL...
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_...
Oracle 存储过程是数据库管理系统Oracle中的一个重要特性,它允许开发者编写一组SQL语句和PL/SQL代码,形成一个可重复使用的程序单元。存储过程可以提高数据库应用的性能,减少网络流量,并且提供更好的安全性。以下...
Oracle存储过程是数据库管理系统Oracle中的一个重要特性,它允许开发者编写包含SQL语句和PL/SQL代码的可重复使用的程序单元。这些程序单元可以接受输入参数,处理数据,然后返回结果,甚至可以创建输出表。在C#编程...
### Oracle PL/SQL 存储过程详解 #### Oracle存储过程基础知识 存储过程是数据库中预编译好的一段SQL或PL/SQL代码,它可以接受输入参数并返回结果,从而实现复杂的功能逻辑。存储过程的主要优势包括提高性能(因为...
在Oracle的PL/SQL环境中,动态SQL主要用于处理那些在编译时无法确定的SQL语句,比如涉及用户输入或动态数据结构的情况。 静态SQL在编译时就已经确定了SQL语句的结构,而动态SQL则是在程序运行时根据需要构建。...
cursor_name SYS_REFCURSOR; BEGIN stmt := 'SELECT * FROM table_name WHERE column = :value'; OPEN cursor_name FOR stmt USING 'some_value'; -- 遍历动态游标 FOR record IN cursor_name LOOP -- 处理...
在Oracle数据库中,存储过程是预编译的SQL和PL/SQL代码集合,它们可以执行特定的任务并返回结果。在处理复杂逻辑或批量操作时,存储过程是非常有用的工具。本篇文档主要介绍了如何通过存储过程返回结果集,分为两种...
异常处理是Oracle PL/SQL中的另一核心特性,它帮助我们处理程序执行过程中的错误和异常情况。Oracle提供了一系列预定义的异常,比如NO_DATA_FOUND、TOO_MANY_ROWS等,程序员可以通过BEGIN...EXCEPTION...END结构来...
CREATE OR REPLACE PROCEDURE sp_paging(p_start IN NUMBER, p_end IN NUMBER, OUT cur_result SYS_REFCURSOR) AS BEGIN OPEN cur_result FOR SELECT * FROM ( SELECT ROWNUM rnum, t.* FROM ( SELECT * FROM ...
o_data OUT SYS_REFCURSOR ) AS BEGIN OPEN o_data FOR SELECT * FROM ( SELECT ROWNUM rnum, t.* FROM my_table t WHERE ROWNUM * p_size ) WHERE rnum > (p_page - 1) * p_size; END; ``` 通过以上...
PROCEDURE get_paged_data(p_start IN NUMBER, p_end IN NUMBER, p_result OUT SYS_REFCURSOR); END pg_query; / CREATE OR REPLACE PACKAGE BODY pg_query AS PROCEDURE get_paged_data(p_start IN NUMBER, p_end...
在Oracle数据库中,存储过程是一种可重复使用的数据库对象,用于封装一系列SQL命令或其他PL/SQL语句,以便于执行复杂的业务逻辑。存储过程的基本结构如下: ```sql CREATE OR REPLACE PROCEDURE 存储过程名字 ( ...
Oracle存储过程是数据库编程的重要组成部分,它允许程序员封装一系列的SQL和PL/SQL语句,以便在需要时重复使用。在大数据量的数据库应用中,分页查询是必不可少的,因为它能够有效地处理和展示结果,避免一次性加载...
Oracle的共享池是一个内存结构,用于存储编译后的SQL语句和PL/SQL块。当使用硬编码(即直接在SQL中写入具体值)的方式查询时,每次不同的值都会生成新的解析树,导致Oracle需要重复解析、优化和执行,这会占用大量...
Oracle存储过程是一组预先编译的SQL和PL/SQL语句,能够提高性能、安全性,并简化复杂的数据库操作。以下是如何在ASP.NET中调用Oracle存储过程的详细步骤。 首先,我们需要创建Oracle存储过程。例如,以下是一个简单...