本文转自:http://www.telerik.com/help/openaccess-orm/openaccess-tasks-oracle-execute-sp-result-set.html

In this topic you will learn how to execute Oracle stored procedures that return SYS_REFCURSOR as out parameters. With the REF_CURSOR you can return a recordset/cursor from a stored procedure.

Suppose, you have two tables named Products and Categories with one-to-many relation.

And you have two stored procedures named SPSingleRefCur and SPTwoRefCursor. The first one is a simple stored procedure having an SYS_REFCURSOR out parameter. The procedure returns all category rows via this cursor.

SQL

CREATE OR replace PROCEDURE SPSingleRefCur(catCur OUT SYS_REFCURSOR )
IS
BEGIN
OPEN catCur FOR SELECT * FROM "CATEGORIES";
END; The second procedure have two SYS_REFCURSOR out parameters. The procedure returns all rows from the Categories and Products tables. It will be used to demonstrate how to obtain multiple result sets using the Telerik OpenAccess ADO API. SQL CREATE OR replace PROCEDURE SPTwoRefCursor (catCur OUT SYS_REFCURSOR, prodCur OUT SYS_REFCURSOR )
IS
BEGIN
OPEN catCur FOR SELECT * FROM "CATEGORIES";
OPEN prodCur FOR SELECT * FROM "PRODUCTS";
END; Telerik OpenAccess ORM uses the ADO.NET (Oracle.DataAcces.Client) Provider from Oracle called ODP.NET. In order to create a new domain model based on a Oracle database, you have to install the ODP.NET Driver from Oracle. You can download it from here. Suppose, you have created a domain model that looks like: Also, you need to add a reference to the Oracle.DataAccess.dll assembly. By default the assembly is located in the following directory: C:\app\{UserName}\product\11.2.\client_1\odp.net\bin\\Oracle.DataAccess.dll Executing Stored Procedures There are two ways to execute stored procedures and get the out parameters:
•Use the generic OpenAccessContext.ExecuteQuery<T> method.
•Create a new OACommand and execute the stored procedure using the OACommand.ExecuteReader method. The first approach is easier and involves less code than the second approach. The second approach gives you more control of the result because you can get a DbDataReader from the OACommand. Using the OpenAccessContext.ExecuteQuery<T> Method The first stored procedure (SPSingleRefCur) will be executed by using the generic OpenAccessContext.Execute<T> method. Because you are using an Oracle specific type in the stored procedures, you need to pass an OracleParameter to the context. You need to set the OracleDbType property of the OracleParameter to OracleDbType.RefCursor. Next, when the parameter is set up, you need to call the ExecuteQuery<T> method of the context to get materialized list of Category objects. The following code-snippet demonstrates how to achieve this: C# using System.Collections.Generic;
using System.Data;
using Oracle.DataAccess.Client; namespace OracleSP
{
class Program
{
static void Main(string[] args)
{
using (EntitiesModel ctx = new EntitiesModel())
{
OracleParameter cursorParameter = new OracleParameter();
cursorParameter.ParameterName = "catCur";
cursorParameter.Direction = ParameterDirection.Output;
cursorParameter.OracleDbType = OracleDbType.RefCursor; IList<Category> categories = ctx.ExecuteQuery<Category>("SPSingleRefCur", CommandType.StoredProcedure, cursorParameter);
}
}
}
} VB.NET Module Module1
Sub Main()
Using ctx As New EntitiesModel()
Dim cursorParameter As New Oracle.DataAccess.Client.OracleParameter() cursorParameter.ParameterName = "catCur"
cursorParameter.Direction = ParameterDirection.Output
cursorParameter.OracleDbType = Oracle.DataAccess.Client.OracleDbType.RefCursor Dim categories As IList(Of Category) = ctx.ExecuteQuery(Of Category)("SPSingleRefCur", CommandType.StoredProcedure, cursorParameter)
End Using
End Sub
End Module Although the direction of the parameter is set to ParameterDirection.Output the result set is returned via the reader, not in the Value property of the parameter. This reader is then materialized a list of Category objects. Note that if the specified type is a persistent type (as in this example), then the returned instances are automatically managed by the context. Using the OACommand.ExecuteReader Method If you have a stored procedure that returns two out parameters of type SYS_REFCURSOR (e.g. the SPTwoRefCursor procedure), then using the generic ExecuteQuery<T> method is no longer appropriate. If you are using the ExecuteQuery<T> method, you can not get both result sets materialized. Only the first result set, which is obtained by the underlying reader will be materialized. In this case, you need to use the second approach, i.e. execute the stored procedure by using an OACommand. The second way to execute stored procedures is to use the OACommand class. With this approach, you have the ability to work with the new lower level ADO API. The Telerik OpenAccess ADO API introduces the Translate<T> method, which can be used to materialize a DbDataReader object to persistent capable or non-persistent capable objects. The example here is similar to the first one. What you need is just another parameter, because you need two output parameters for the SPTwoRefCursor procedure. Once the parameters are initialized, you pass them to the OACommand. Next you execute the command by calling the ExecuteReader method to get a data reader. With the reader in hand, you use the generic Translate<T> method on the OpenAccessContext to materialize instances of the Category entity from the reader. By executing the reader.NextResult() method, you switch to the next result set and get the values of the second out parameter. These values could also be materialized with the Translate<T> method but this time you will get objects of type Product. C# using System.Collections.Generic;
using System.Data;
using Oracle.DataAccess.Client;
using Telerik.OpenAccess.Data.Common; namespace OracleSP
{
class Program
{
static void Main(string[] args)
{
using (EntitiesModel ctx = new EntitiesModel())
{
using (OACommand cmd = ctx.Connection.CreateCommand())
{
OracleParameter refCurPar1 = new OracleParameter();
refCurPar1.ParameterName = "catCur";
refCurPar1.Direction = ParameterDirection.Output;
refCurPar1.OracleDbType = OracleDbType.RefCursor; OracleParameter refCurPar2 = new OracleParameter();
refCurPar2.ParameterName = "prodCur";
refCurPar2.Direction = ParameterDirection.Output;
refCurPar2.OracleDbType = OracleDbType.RefCursor; cmd.CommandText = "SPTwoRefCursor";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(new object[] { refCurPar1, refCurPar2 }); using (OADataReader reader = cmd.ExecuteReader())
{
IEnumerable<Category> categories = ctx.Translate<Category>(reader);
reader.NextResult();
IEnumerable<Product> products = ctx.Translate<Product>(reader);
}
}
}
}
}
} VB.NET Module Module1
Sub Main()
Using ctx As New EntitiesModel()
Using cmd As Telerik.OpenAccess.Data.Common.OACommand = ctx.Connection.CreateCommand() Dim refCurPar1 As New Oracle.DataAccess.Client.OracleParameter()
refCurPar1.ParameterName = "catCur"
refCurPar1.Direction = ParameterDirection.Output
refCurPar1.OracleDbType = Oracle.DataAccess.Client.OracleDbType.RefCursor Dim refCurPar2 As New Oracle.DataAccess.Client.OracleParameter()
refCurPar2.ParameterName = "prodCur"
refCurPar2.Direction = ParameterDirection.Output
refCurPar2.OracleDbType = Oracle.DataAccess.Client.OracleDbType.RefCursor cmd.CommandText = "SPTwoRefCursor"
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddRange(New Object() {refCurPar1, refCurPar2}) Using reader As Telerik.OpenAccess.Data.Common.OADataReader = cmd.ExecuteReader()
Dim categories As IEnumerable(Of Category) = ctx.Translate(Of Category)(reader)
reader.NextResult()
Dim products As IEnumerable(Of Product) = ctx.Translate(Of Product)(reader)
End Using
End Using
End Using
End Sub
End Module

[转]How to: Execute Oracle Stored Procedures Returning RefCursors的更多相关文章

  1. Spring, Hibernate and Oracle Stored Procedures

    一篇英文博文,写的是利用hibernate处理存储过程中的游标等等: Motivation: While there are a few resources available online for ...

  2. [转]Oracle Stored Procedures Hello World Examples

    本文转自:http://www.mkyong.com/oracle/oracle-stored-procedures-hello-world-examples/ List of quick examp ...

  3. Home / Python MySQL Tutorial / Calling MySQL Stored Procedures in Python Calling MySQL Stored Procedures in Python

    f you are not familiar with MySQL stored procedures or want to review it as a refresher, you can fol ...

  4. [MySQL] Stored Procedures 【转载】

    Stored routines (procedures and functions) can be particularly useful in certain situations: When mu ...

  5. Good Practices to Write Stored Procedures in SQL Server

    Reference to: http://www.c-sharpcorner.com/UploadFile/skumaar_mca/good-practices-to-write-the-stored ...

  6. An Introduction to Stored Procedures in MySQL 5

    https://code.tutsplus.com/articles/an-introduction-to-stored-procedures-in-mysql-5--net-17843 MySQL ...

  7. Cursors in MySQL Stored Procedures

    https://www.sitepoint.com/cursors-mysql-stored-procedures/ After my previous article on Stored Proce ...

  8. MySQL Error Handling in Stored Procedures 2

    Summary: this tutorial shows you how to use MySQL handler to handle exceptions or errors encountered ...

  9. Oracle Stored Procedure demo

    1.how to find invalid status stored procedure and recompile them? SELECT OBJECT_NAME , status FROM u ...

随机推荐

  1. 同样的JS写法,为啥只有IE9模式正常?

    使用 IE F12 开发者工具,选择不同的“文档模式” 从IE7 - IE9,只有IE9正常! <!DOCTYPE html> <html> <script type=& ...

  2. 430单片机之定时器A功能的大致介绍

    总的来说,430单片机一共有三个定时器,定时器A,定时器B,还有就是看门狗定时器,这里我们主要是讨论430单片机的定时器A的功能,定时器A的功能是我目前见过最厉害的定时器,视频上说用好定时器A的话,对 ...

  3. CodeForces 149D Coloring Brackets 区间DP

    http://codeforces.com/problemset/problem/149/D 题意: 给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色,上蓝色 2 ...

  4. uvalive 4795 Paperweight

    题意:给出一个5个顶点的多面体以及多面体内一点P.求让 多面体不同的方式(即以不同的面)放在地面上,设这个着地的面为A,多面体重心在A上的投影为B,在保证B在A内部且距离A的各个边界不小于0.2的前提 ...

  5. dataStructure@ Check whether a given graph is Bipartite or not

    Check whether a given graph is Bipartite or not A Bipartite Graph is a graph whose vertices can be d ...

  6. openstack iptables

  7. fuse文件系统

    用户空间文件系统(Filesystem in Userspace,简称FUSE)是操作系统中的概念,指完全在用户态实现的文件系统.目前Linux通过内核模块对此进行支持.一些文件系统如ZFS,glus ...

  8. Web缓存基础:术语、HTTP报头和缓存策略

    简介 对于您的站点的访问者来说,智能化的内容缓存是提高用户体验最有效的方式之一.缓存,或者对之前的请求的临时存储,是HTTP协议实现中最核心的内容分发策略之一.分发路径中的组件均可以缓存内容来加速后续 ...

  9. [iOS基础控件 - 6.8] 各种数据类型的@property属性

    A.内存管理 NSString: copy 基本数据类型.结构体(int, CGFloat, BOOL, CGRect等):assign 对象(如自定义model类型.NSArray.NSDictio ...

  10. 楔子(xiē zǐ)

    戏曲.小说的引子.一般放在篇首,用以点明.补充正文,或者说引出正文或是为正文做铺垫.指旧小说的引子,通常放在小说故事开始之前,起引出或补充正文的作用.这不过是个楔子,下面还有正文.——<儒林外史 ...