用.NET调用oracle的存储过程返回记录集

原创 2003年10月25日 22:27:00

文章出处:伟网动力(http://www.weiw.com)
有何见解,可以来此论坛 http://www.weiw.com/bbs/
转贴请标明出处,谢谢。
最近做一个项目,为了提高数据库安全性,客户要求所有数据库操作都要放在存储过程。象一般的更新操作,返回一个值的,都比较容易实现。而要想返回记录集就比较麻烦,我在网上搜了一下,这方面的文章并不多。在此总结一下,供大家参考。
有关.NET如何访问oracle数据库,在此就不介绍了。相关的资料也很多,有兴趣的朋友可以看下文。
使用ASP.NET访问Oracle数据库的方法
http://www.weiw.com/article/list.asp?id=649

oracle的存储过程返回记录集,关键之处是要用游标。
关于数据库的游标(cursor)大家肯定都接触不少,我们可以通过OPEN,FETCH,CLOSE操作控制游标进行各种方便的操作,这方面的例子我就不在重复了。我们现在要介绍的是游标变量(cursor variable)。类似游标,游标变量也是指向一个查询结果集的当前行。不同的是,游标变量能为任何类型相似(type-compatible)的查询打开,而并不是绑定到某一个特定的查询。通过游标变量,你可以在数据库的数据提取中获得更多的方便。

首先是建立表。

CREATE TABLE LIHUAN.BILL_POINTS
(
    POINTS_ID                      NUMBER(10,0) NOT NULL,
    CUSTOMER_ID                    NUMBER(10,0) NOT NULL,
    BILL_POINT_NO                  NUMBER(2,0) DEFAULT 1 NOT NULL,
    CONSTRAINT PK_BILL_POINTS PRIMARY KEY (POINTS_ID)
)
/

其次,建PACKAGE
CREATE OR REPLACE PACKAGE LIHUAN.YY_PKG_BILL_POINT_NO/*取得用户的所有计费电序号*/
IS
TYPE T_CURSOR IS REF CURSOR;

   PROCEDURE BILL_POINT_NO(P_CUSTOMER_ID BILL_POINTS.CUSTOMER_ID%TYPE,
   Re_CURSOR OUT T_CURSOR);
END;
/

再次,建PACKAGE BODY
CREATE OR REPLACE PACKAGE BODY LIHUAN.YY_PKG_BILL_POINT_NO/*取得用户的所有计费电序号*/
IS

 PROCEDURE BILL_POINT_NO(P_CUSTOMER_ID BILL_POINTS.CUSTOMER_ID%TYPE,
   Re_CURSOR OUT T_CURSOR)
   IS
   V_CURSOR T_CURSOR;
   BEGIN
      OPEN V_CURSOR FOR
            select Bill_Point_No from BILL_POINTS where CUSTOMER_ID =P_CUSTOMER_ID;
           Re_CURSOR := V_CURSOR;
   END;
END;
/

最后,在.NET中程序调用。
public DataSet Bill_Point_No(string CUSTOMER_ID)//ok
  {
   DataSet dataset = new DataSet();
   Hashtable HT=new Hashtable();
   HT.Add("P_CUSTOMER_ID",CUSTOMER_ID);
   if(RunProcedure("Re_CURSOR",OracleType.Cursor,ref dataset,HT,bmsOracleUser+".YY_PKG_BILL_POINT_NO.BILL_POINT_NO",bmsOracleConnectionString))
   {
    ;
   }
   else
   {
    dataset=null;
   }
   return dataset;
  }

public bool RunProcedure(string ReturnParameter,OracleType ParamType,ref DataSet Dataset,Hashtable HT ,string ProcedureName,string OracleConnection)
  { 
   System.Data.OracleClient.OracleConnection dsconnection = new System.Data.OracleClient.OracleConnection(OracleConnection);
   System.Data.OracleClient.OracleCommand dacommand = new System.Data.OracleClient.OracleCommand(ProcedureName,dsconnection);
   dsconnection.Open(); 
   dacommand.CommandType=CommandType.StoredProcedure;
   IDictionaryEnumerator Enumerator;
   Enumerator = HT.GetEnumerator();
   object Value=null;
   OracleParameter OracleParam;
   OracleParam = dacommand.Parameters.Add(new OracleParameter(ReturnParameter,ParamType));
   OracleParam.Direction = ParameterDirection.Output;
   while(Enumerator.MoveNext())
   {
    Value = Enumerator.Value;
    OracleParam=dacommand.Parameters.Add(new OracleParameter(Enumerator.Key.ToString(), Value));
   }
   OracleDataAdapter ODAdapter=new OracleDataAdapter(dacommand);
            try
   {
    ODAdapter.Fill(Dataset);
     return true;
   }
   catch(System.Exception e)
   {
    e.ToString();
    return false;
   }
   finally
   {  
    HT.Clear();
    dacommand.Parameters.Clear();
    dsconnection.Close();
   }
 }

C#调用ORACLE存储过程返回结果集及函数

ORACLE段: 首先在ORACLE建立PACKAGE和PACKAGE BODY,将在这里面定义函数和存储过程返回结果集。 1:建立PACKAGE: CREATE OR REPLAC...
  • zzy7075
  • zzy7075
  • 2015年02月27日 10:40
  • 1446

.net 调用Oracle存储过程

在.NET中调用Oracle9i存储过程经验总结(1)  在.NET中调用Oracle9i存储过程可以用多个数据提供者,比如OralceClient,OleDb。本文将用OralceClient为例。...
  • u010678947
  • u010678947
  • 2014年03月07日 12:38
  • 1554

Mybatis 调用oracle存储过程返回结果集

1.这里我是直接接http://blog.csdn.net/shen525758203/article/details/32331229
  • SHEN525758203
  • SHEN525758203
  • 2014年06月20日 15:51
  • 3098

PostgreSQL存储过程返回数据集实例

这里用一个实例来演示PostgreSQL存储过程如何返回数据集. 1 首先准备数据表 //member_category create table member_category(id serial,...
  • wuyilun526
  • wuyilun526
  • 2015年01月16日 17:01
  • 1152

spring调用Oracle存储过程,并返回结果集的完整实例

这是总结以前使用spring调用Oracle存储过程,并用cursor返回结果集的一个完整实例,希望能对大家有帮助。  1. 创建表:  Java代码   create ...
  • ylc9527
  • ylc9527
  • 2013年09月03日 10:53
  • 1783

Java调用oracle存储过程通过游标返回临时表数据

项目开发过程中,不可避免的会用到存储过程返回结果集。特别是选择Oracle做为数据库时,就更麻烦了,因为Oracle存储过程和SQLServer的有点不太一样,直接返回不了结果集,那么怎么才能在使用O...
  • qq_36617521
  • qq_36617521
  • 2017年02月22日 09:53
  • 412

如何在ORACLE中异步调用存储过程的方法

在ORACLE数据库实际应用过程中,经常把业务处理逻辑的放在存储过程,客户端通过ADO进行调用。有些业务逻辑处理量大并且复杂,使客户端调用存储过程后,长时间没有反应,也不知存储过程运行状态,本文讲述如...
  • yellowd1
  • yellowd1
  • 2015年06月28日 16:05
  • 2206

JAVA调用ORACLE的存储过程、函数的返回结果集

具体过程如下:CREATE TABLE STOCK_PRICES( RIC VARCHAR(6) PRIMARY KEY, PRICE NUMBER(7,2), UPDATED...
  • paul50060049
  • paul50060049
  • 2017年05月11日 21:03
  • 269

Oracle 无返回值的存储过程

PL/SQL分页 分页技术的实现:
  • ItJavawfc
  • ItJavawfc
  • 2014年07月14日 23:08
  • 1209

在PL/SQL中调用存储过程--oracle

在oracle10中写好了存储过程,代码如下: CREATE OR REPLACE Procedure Proc_Insert ( sName in varchar2,...
  • wozengcong
  • wozengcong
  • 2013年12月07日 10:46
  • 23963
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用.NET调用oracle的存储过程返回记录集
举报原因:
原因补充:

(最多只允许输入30个字)