C#对Oracle存储过程的调用

本文介绍如何在C#中调用Oracle存储过程,并提供完整的示例代码。包括创建表、插入数据、创建及调用存储过程等步骤。

None.gif -- 创建表
None.gif
declare  num  number
None.gif
begin  
None.gif
select   count ( 1 into  num  from  user_tables  where  table_name = ' SRCT ' ;    -- 判断当前要创建的表在数据库中是否存在.
None.gif
if  num > 0  
None.gif
then   execute  immediate  ' drop table  ' || ' SRCT ' -- 表名要大写
None.gif
end   if
None.gif
execute  immediate  ' CREATE TABLE SRCT
None.gif(  
None.gif  SN  char(11), 
None.gif  XM  varchar2(30),  --姓名 
None.gif  KSCJ  number(3),   --考试成绩
None.gif  KSRQ  Date         --考试日期
None.gif      
None.gif)
'
None.gif
end ;
None.gif
/
None.gif
commit ;
None.gif
/
None.gif
None.gif
-- 注:上面的表名要大写.

None.gif -- 插入数据
None.gif
declare
None.gifmaxrecords constant 
int : = 50 ;
None.gif
int : = 1 ;
None.gif
begin
None.gif
for  i  in   1 ..maxrecords
None.gifloop
None.gif
insert   into  SRCT(SN,XM,KSCJ,KSRQ) values (i, ' frj ' || i,i + 10 ,sysdate);
None.gif
end  loop
None.gif
-- dbms_output.put_line('成功录入数据!');
None.gif
commit ;
None.gif
end ;
None.gif
/
None.gif
-- 查询数据,检查数据插入操作是否成功.
None.gif
SELECT   *   FROM  SRCT  WHERE  ROWNUM < 3 ;
None.gif
/

None.gif -- 检查存储过程是否存在
None.gif
declare  
None.gifnum 
number ;
None.gifmsg 
varchar2 ( 30 ): =   ' 数据库中不存在该存储过程 ' ;
None.gif
begin
None.gif  
select     count ( 1 into  num    
None.gif  
from    user_objects     
None.gif  
where    object_type    =   ' PROCEDURE '    
None.gif  
and     object_name = ' WRITE_SRC '   ;
None.gif  
None.gif  
if  num > 0  
None.gif  
then  
None.gif      msg:
=   ' 该存储过程已经存在 ' ;
None.gif  
end   if ;
None.gif  dbms_output.put_line(msg); 
None.gif
end  ;
None.gif
/

None.gif -- 创建存储过程
None.gif
CREATE   OR   REPLACE   Procedure  
None.gifWRITE_SRC( M_SN 
in   char   , M_XM  in    varchar2 ,M_KSCJ  in   integer ,
None.gifM_KSRQ 
in  Date,RES out  integer ,ERR out
None.gif
varchar2 )
None.gif
as
None.gifV_COUNT 
number : = 0 ;
None.gif  
Begin
None.gif  
None.gif  RES:
=- 2 ;
None.gif  ERR:
= ' 数据库中不存在该纪录,更新失败. ' ;
None.gif  
select   count (SN)  INTO  V_COUNT 
None.gif  
FROM  SRCT 
None.gif  
Where   SN = M_SN  AND  XM = M_XM;
None.gif  
None.gif  
IF  V_COUNT > 0   THEN  
None.gif    
Update  SRCT
None.gif    
Set  KSCJ = M_KSCJ,KSRQ = M_KSRQ
None.gif    
Where   SN = M_SN  AND  XM = M_XM;
None.gif    
Commit ;
None.gif    RES:
= 1 ;
None.gif    ERR:
= ' 更新成功! ' ;
None.gif   
return ;
None.gif  
END   IF ;
None.gif  exception
None.gif    
when  others  then
None.gif     RES:
=- 1 ;
None.gif     ERR:
= ' 更新失败 ' ;
None.gif   
return  ;
None.gif
End   ;
None.gif
/
None.gif
None.gif
commit ;
None.gif
/

None.gif
None.gif
-- 调用存储过程
None.gif
declare  
None.gifres 
int ;
None.giferr 
Varchar2 ( 80 );
None.gif
Begin
None.gifres:
= ' 3 ' ;
None.giferr:
= ' 更新成功 ' ;
None.gifWRITE_SRC(
' 1 ' , ' frj1 ' , 300 ,sysdate,res,err);
None.gif
COMMIT ;
None.gifdbms_output.put_line(res);
None.gifdbms_output.put_line(err); 
None.gif
End ;
None.gif
/
None.gif
None.gif
select  sn,xm,kscj  from  srct  WHERE  SN = ' 1 '   AND  XM = ' frj1 ' ;
None.gif
/

None.gif -- 注:易犯错误
None.gif--
以上语句均在"SQL*Plus 工作单"上运行;
None.gif

None.gif  
1 .每一个小单元的语句后要加 ' ; ' 号;
None.gif  
2 .不能将字符串赋值的单引号写成双引号;
None.gif    如: err:
= ' 更新成功! ' ; 不能写成 err: = "更新成功!";
None.gif    以上错误系统将提示:"警告: 创建的过程带有编译错误。"
None.gif  
3 .存储过程传递与赋值的参数名称,个数,类型(字段类型,返回的类型( in/ out))要与调用的存储过程以及该存储过程
None.gif    所访问的表中相应的字段类型严格对应.
None.gif    还有一些约定的写法也需遵守.
None.gif    如:其中的" M_KSCJ "对应表中的" KSCJ "字段, 应写成(M_KSCJ 
in   integer )不能写成( M_KSCJ  in    number ( 3 ));
None.gif    "M_SN"对应表中的 "SN" 字段,应写成 (M_SN 
in   char ) 不能写成 (M_SN  in   Varchar2 )
None.gif  
4 .在c#中进行调用时,还要注意它的输入 / 输出类型,如上例中的" out  integer  res "  为输出类型,应将其
None.gif      OracleParameter
[]  parm  =  new OracleParameter [ 1 ] ;
None.gif      parm
[ 0 ]   =  new OracleParameter("RES", OracleType.Int16   );
None.gif      parm
[ 0 ] .Direction  =  ParameterDirection.Output  ;  -- 将其设为输出类型;
None.gif
      具体调用方法将在稍后进行介绍;
None.gif  
5 .定义存储过程时,其参数名称最好不要与字段名称同名(不区分大小写);
None.gif     如上面的存储过程建议不要写成:
None.gif     WRITE_SRC( SN 
in   char   , XM  in    varchar2 ,KSCJ  in   integer ,
None.gif                KSRQ 
in  Date,RES out  integer ,ERR out  varchar2 )

None.gif // --在c#中的调用
None.gif
 
None.gif 
None.gif   
public   int  upInfo( string  m_sn, string  m_sxm, int  m_ikscj,DateTime m_dksrq,  out   int  m_ires,  out   string  m_serr)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
string ConnStr=GetConnStr();
InBlock.gif            OracleCommand cmd 
= new OracleCommand();
InBlock.gif            OracleConnection conn 
= new OracleConnection(ConnStr);
InBlock.gif            
int rows = 0;
InBlock.gif            mres 
= -110;
InBlock.gif            merr 
= "";
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                cmd.CommandType 
= CommandType.StoredProcedure;
InBlock.gif                cmd.CommandText 
= "WRITE_SRC";
InBlock.gif                OracleParameter[] parm 
= new OracleParameter[6];
InBlock.gif                
//in
InBlock.gif
                parm[0= new OracleParameter("M_SN", OracleType.Char, 11);   --与SQL区别,sql存储过程需要在定义与此处,在其参数前加"@"符号;
InBlock.gif                parm[
1= new OracleParameter("M_XM", OracleType.VarChar, 2);
InBlock.gif                parm[
2= new OracleParameter("M_KSCJ", OracleType.Number, 3);
InBlock.gif                parm[
3= new OracleParameter("M_KSRQ", OracleType.DateTime , 8);
InBlock.gif                
//out
InBlock.gif
                parm[4= new OracleParameter("RES", OracleType.Int16);
InBlock.gif                parm[
5= new OracleParameter("ERR", OracleType.VarChar, 50);
InBlock.gif
InBlock.gif                
//指明参数是输入还是输出型
InBlock.gif
                for (int i = 0; i < parm.Length-2; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    parm[i].Direction 
= ParameterDirection.Input;
ExpandedSubBlockEnd.gif                }

InBlock.gif                parm[
4].Direction = ParameterDirection.Output;
InBlock.gif                parm[
5].Direction = ParameterDirection.Output;
InBlock.gif
InBlock.gif              
InBlock.gif                
//给参数赋值
InBlock.gif
                parm[0].Value = m_sn;
InBlock.gif                parm[
1].Value = m_sxm;
InBlock.gif                parm[
2].Value = m_ikscj;
InBlock.gif                parm[
3].Value = OracleDateTime.Parse(m_dksrq.ToShortDateString());
InBlock.gif                
--直接用update语句更新时,需要采用下面的日期格式.
InBlock.gif                
-- string msksrq = mksrq.Day.ToString() + "-" + mksrq.Month.ToString() + "" + " -" + mksrq.Year.ToString().Substring(22);
InBlock.gif          
InBlock.gif                
//传递参数给Oracle命令
InBlock.gif
                for (int i = 0; i < parm.Length; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    cmd.Parameters.Add(parm[i]);
ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                
//打开连接
InBlock.gif
                if (conn.State != ConnectionState.Open)
InBlock.gif                    conn.Open();
InBlock.gif
InBlock.gif                cmd.Connection 
= conn;
InBlock.gif                rows 
= cmd.ExecuteNonQuery();
InBlock.gif
InBlock.gif                
//取出返回值
InBlock.gif
                m_ires = Convert.ToInt16(parm[4].Value);//res
InBlock.gif
                m_serr = parm[5].Value.ToString();//err
InBlock.gif

ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch (Exception er)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                merr 
= System.Environment.NewLine + "res:" + m_ires.ToString() + "err:" + er.ToString();
InBlock.gif                MrfuWriteEventLog.C_WriterEventLog.WriteEventLogAppend(
"UploadDriInfo: mres=" + m_ires.ToString() + "merr:" + er.ToString());
ExpandedSubBlockEnd.gif            }

InBlock.gif            
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
//关闭连接,释放空间.
InBlock.gif
                if (conn.State == ConnectionState.Open)
InBlock.gif                    conn.Close();
InBlock.gif                conn.Dispose();
InBlock.gif                cmd.Parameters.Clear();
InBlock.gif                cmd.Dispose();
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
return rows;
ExpandedBlockEnd.gif        }

None.gif

None.gif -- 按时间段分页显示
None.gif
 
None.gif
select  sn,xm,kscj,ksrq  from  SRCT  
None.gif
where  ksrq  between   to_date( ' 2003-01-01 ' , ' yyyy-mm-dd ' )    and    to_date( ' 2007-06-28 ' , ' yyyy-mm-dd ' order   by  ksrq;
None.gif
/
None.gif
None.gif
None.gif
select   *   from  
None.gif
select  b. * ,rownum row_num  from
None.gif    (
None.gif     
select   sn,xm,kscj,ksrq  from  SRCT  c
None.gif     
where  ksrq  between   to_date( ' 2003-01-01 ' , ' yyyy-mm-dd ' )    and    to_date( ' 2007-06-28 ' , ' yyyy-mm-dd ' order   by  c.sn 
None.gif     )b
None.gif)a 
where  a.row_num  between   1   and   10
None.gif
None.gif
/
None.gif
-- 注: oracle的rownum是在提取记录时就已经生成,它先于排序操作,所以必须使用子查询先排序.

None.gif -- ==转oracle分页存储过程==
None.gif
CREATE   OR   REPLACE   PACKAGE DotNet   is
None.gif
None.gif  TYPE type_cur 
IS  REF  CURSOR ;      -- 定义游标变量用于返回记录集
None.gif
   PROCEDURE  DotNetPagination
None.gif  (
None.gif  Pindex 
in   number ,                 -- 分页索引
None.gif
  Psql  in   varchar2 ,                 -- 产生dataset的sql语句
None.gif
  Psize  in   number ,                  -- 页面大小
None.gif
  Pcount out  number ,                -- 返回分页总数
None.gif
  v_cur out type_cur                -- 返回当前页数据记录
None.gif
  );
None.gif  
procedure  DotNetPageRecordsCount
None.gif  (
None.gif  Psqlcount 
in   varchar2 ,            -- 产生dataset的sql语句
None.gif
  Prcount   out  number               -- 返回记录总数
None.gif
  );
None.gif
end  DotNet;
None.gif
/
None.gif
CREATE   OR   REPLACE   PACKAGE BODY DotNet   is
None.gif 
-- ***************************************************************************************
None.gif
   PROCEDURE  DotNetPagination
None.gif  (
None.gif  Pindex 
in   number ,
None.gif  Psql 
in   varchar2 ,
None.gif  Psize 
in   number ,
None.gif  Pcount out 
number ,
None.gif  v_cur out type_cur
None.gif  )
None.gif  
AS
None.gif  v_sql 
VARCHAR2 ( 1000 );
None.gif  v_count 
number ;
None.gif  v_Plow 
number ;
None.gif  v_Phei 
number ;
None.gif  
Begin
None.gif  
-- ----------------------------------------------------------取分页总数
None.gif
  v_sql : =   ' select count(*) from ( '   ||  Psql  ||   ' ) ' ;
None.gif  
execute  immediate v_sql  into  v_count;
None.gif  Pcount :
=  ceil(v_count / Psize);
None.gif  
-- ----------------------------------------------------------显示任意页内容
None.gif
  v_Phei : =  Pindex  *  Psize  +  Psize;
None.gif  v_Plow :
=  v_Phei  -  Psize  +   1 ;
None.gif  
-- Psql := 'select rownum rn,t.* from cd_ssxl t' ;            --要求必须包含rownum字段
None.gif
  v_sql : =   ' select * from ( '   ||  Psql  ||   ' ) where rn between  '   ||  v_Plow  ||   '  and  '   ||  v_Phei ;
None.gif  
open  v_cur  for  v_sql;
None.gif  
End  DotNetPagination;
None.gif 
-- **************************************************************************************
None.gif
   procedure  DotNetPageRecordsCount
None.gif  (
None.gif  Psqlcount 
in   varchar2 ,
None.gif  Prcount   out 
number
None.gif  )
None.gif  
as
None.gif  v_sql 
varchar2 ( 1000 );
None.gif  v_prcount 
number ;
None.gif  
begin
None.gif  v_sql :
=   ' select count(*) from ( '   ||  Psqlcount  ||   ' ) ' ;
None.gif  
execute  immediate v_sql  into  v_prcount;
None.gif  Prcount :
=  v_prcount;                   -- 返回记录总数
None.gif
   end  DotNetPageRecordsCount;
None.gif 
-- **************************************************************************************
None.gif
end  DotNet;
None.gif
None.gif
/
None.gif

None.gif // ==使用示例==
ExpandedBlockStart.gifContractedBlock.gif
        /**/ /// <summary>
InBlock.gif       
/// 填充dataSet数据集-Oracle库
InBlock.gif       
/// </summary>
InBlock.gif       
/// <param name="pindex">当前页</param>
InBlock.gif       
/// <param name="psql">执行查询的SQL语句</param>
InBlock.gif       
/// <param name="psize">每页显示的记录数</param>
ExpandedBlockEnd.gif       
/// <returns></returns>

None.gif        private   bool  gridbind( int  pindex,  string  psql,  int  psize)
ExpandedBlockStart.gifContractedBlock.gif     
dot.gif {
InBlock.gif            OracleConnection conn 
= new OracleConnection();
InBlock.gif            OracleCommand cmd 
= new OracleCommand();
InBlock.gif            OracleDataAdapter dr 
= new OracleDataAdapter();
InBlock.gif            conn.ConnectionString 
= System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
InBlock.gif            cmd.Connection 
= conn;
InBlock.gif            cmd.CommandType 
= CommandType.StoredProcedure;
InBlock.gif            conn.Open();
InBlock.gif            cmd.CommandText 
= "DotNet.DotNetPageRecordsCount";
InBlock.gif            cmd.Parameters.Add(
"psqlcount", OracleType.VarChar).Value = psql;
InBlock.gif            cmd.Parameters.Add(
"prcount", OracleType.Number).Direction = ParameterDirection.Output;
InBlock.gif            
InBlock.gif            cmd.ExecuteNonQuery();
InBlock.gif            
string PCount = cmd.Parameters["prcount"].Value.ToString();
InBlock.gif            cmd.Parameters.Clear();
InBlock.gif            cmd.CommandText 
= "DotNet.DotNetPagination";
InBlock.gif            
if (pindex != 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                cmd.Parameters.Add(
"pindex", OracleType.Number).Value = pindex - 1;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                cmd.Parameters.Add(
"pindex", OracleType.Number).Value = pindex;
ExpandedSubBlockEnd.gif            }

InBlock.gif            cmd.Parameters.Add(
"psql", OracleType.VarChar).Value = psql;
InBlock.gif            cmd.Parameters.Add(
"psize", OracleType.Number).Value = psize;
InBlock.gif            cmd.Parameters.Add(
"v_cur", OracleType.Cursor).Direction = ParameterDirection.Output;
InBlock.gif            cmd.Parameters.Add(
"pcount", OracleType.Number).Direction = ParameterDirection.Output;
InBlock.gif            dr.SelectCommand 
= cmd;
InBlock.gif            
try
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                ds 
= new DataSet();
InBlock.gif                dr.Fill(ds);
InBlock.gif                
//显示页码条的状态
InBlock.gif
                showStatus(Convert.ToInt32(cmd.Parameters["pindex"].Value) + 1,
InBlock.gif                    Convert.ToInt32(cmd.Parameters[
"pcount"].Value),
InBlock.gif                    Convert.ToInt32(PCount));
InBlock.gif                
for (int i = 0; i < ds.Tables.Count; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif//把数据行为零的表删除
InBlock.gif
                    if (ds.Tables[i].Rows.Count == 0)
InBlock.gif                        ds.Tables.Remove(ds.Tables[i].TableName);
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                Console.WriteLine(ex.Message);
InBlock.gif                
return false;
ExpandedSubBlockEnd.gif            }

InBlock.gif 
InBlock.gif            conn.Close();
InBlock.gif            
return true;
ExpandedBlockEnd.gif    }

全文SQL
 

posted on 2007-06-18 23:04 DotNet编程 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/furenjun/archive/2007/06/18/orcaleprocedure.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值