日期:2014-05-17  浏览次数:20832 次

oracle里的存储过程
为什么在C#里调用ORACLE的存储过程那么麻烦?不明白为什么要写包头及包体和游标。为何不像SQL SERVER一样???感觉到ORACLE里写存储过程没有在SERVER里写的爽。有没有人举个简单的C#调用ORACLE存储过程的例子?

------解决方案--------------------
OracleConnection conn = new OracleConnection(Connstr);
conn.Open();
OracleTransaction tx = conn.BeginTransaction();
OracleCommand cmd = conn.CreateCommand();
cmd.Transaction = tx;
cmd.CommandText = "declare xx blob; begin dbms_lob.createtemporary(xx, false, 0); :tempblob := xx; end; ";
cmd.Parameters.Add(new OracleParameter( "tempblob ", OracleType.Blob)).Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery();
OracleLob tempLob = (OracleLob)cmd.Parameters[0].Value;
tempLob.BeginBatch(OracleLobOpenMode.ReadWrite);
tempLob.Write(picValue,0,picValue.Length);
tempLob.EndBatch();
cmd.Parameters.Clear();
cmd.CommandText = "PKG_PEPWEB_TransgressMGR.AddTransgressInfo ";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add( new OracleParameter( "AHPZL ",OracleType.VarChar,2 ) ).Value = m_HPZL;
cmd.Parameters.Add( new OracleParameter( "AHPHM ",OracleType.VarChar,15 ) ).Value = m_HPHM;
cmd.Parameters.Add( new OracleParameter( "AWFSJ ",OracleType.DateTime ) ).Value = DateTime.Parse(m_WFSJ);
cmd.Parameters.Add( new OracleParameter( "ARoadID ",OracleType.VarChar,10 ) ).Value = m_RoadID;
cmd.Parameters.Add( new OracleParameter( "Awzxwno ",OracleType.VarChar,200 ) ).Value = m_WFXW;
cmd.Parameters.Add( new OracleParameter( "AJCSD ",OracleType.Number,4 ) ).Value = Decimal.Parse(m_JCSD);
cmd.Parameters.Add( new OracleParameter( "APICNAME ",OracleType.VarChar,200 ) ).Value= m_PICNAME;
cmd.Parameters.Add( new OracleParameter( "ACARSTATE ",OracleType.VarChar,1 ) ).Value = m_CARSTATE;
cmd.Parameters.Add( new OracleParameter( "AJBR ",OracleType.VarChar,30 ) ).Value = m_JBR;
cmd.Parameters.Add( new OracleParameter( "APHOTO ", OracleType.Blob ) ).Value = tempLob;
OracleParameter or=new OracleParameter( "FLAG ", OracleType.Int32);
or.Direction = ParameterDirection.Output;
cmd.Parameters.Add( or );
try
{
cmd.ExecuteNonQuery();
tx.Commit();
}
catch (OracleException ex)
{
s=ex.Message;

throw ex;
}
if ( s!=null)
{

}
return (int)or.Value;
------解决方案--------------------
//这个是使用GotDotNet.ApplicationBlocks.Data.Oracle调用oracle存储过程
public DataSet GetRoadALL()
{
DataSet ds=new DataSet();
adoHelper.GetSpParameterSet(Connstr, "PKG_PEPWEB_Road.GetRoadALL ");
OracleParameter[] oraParameter=new OracleParameter[1];
oraParameter[0]=new OracleParameter( "Rst ",OracleType.Cursor);
oraParameter[0].Direction=ParameterDirection.Output;
ds=adoHelper.ExecuteDataset(Connstr, "PKG_PEPWEB_Road.GetRoadALL ",oraParameter);
return ds;
}