1.OracleParameterpout1=OracleDbType.Varchar2,50);3.数组的参数类型为OracleCollectionType.PLSQLAssociativeArray,且必须明确指定数据元素的个数。如:OracleParameterv_OIDS=newOracleParameter("v_OIDS",OracleDbType.Int64);v_OIDS.Direction=ParameterDirection.Output;v_OIDS.Size=10;v_OIDS.CollectionType=OracleCollectionType.PLSQLAssociativeArray;4.当参数类型是ParameterDirection.Output,调用存储过程后,判定输出参数值是否为null以及转化成c#数据类型的注重事项:OracleParameterpout1=newOracleParameter("v_reason",OracleDbType.varchar2,50);pout1.Direction=ParameterDirection.Output;DataBaseHelper.RunProcedure("PRC_CON_sysuserlogin",newIDataParameter[]{pin1,pin2},pout1);直接用pout1.Value==null是无效的,必须先将其转化为Oracle.DataAccess.Types中的数据类型,然后用Oracle.DataAccess.Types中的数据类型的IsNull属性来判定。如:boolbIsnull=((Oracle.DataAccess.Types.OracleString)pout1.Value).IsNull;转化成c#的数据类型时不能直接用Convert方法和Parase方法,必须转化成Oracle.DataAccess.Types中的数据类型,然后调用向对应的房发.Toxxxx()或者先ToString(),然后在转化。如OracleParameterpout3=newOracleParameter("age",OracleDbType.Int32,ParameterDirection.Output);...intage=((Oracle.DataAccess.Types.OracleDecimal)pout3.Value).ToInt32();或者intage=int.Parase(pout3.Value.ToString());5.输出数组的遍历方法:假如输出参数类型是数组类型,遍历数组中各个元素的方法:OracleParameterv_OIDS=newOracleParameter("v_OIDS",OracleDbType.Int64);v_OIDS.Direction=ParameterDirection.Output;v_OIDS.Size=10;v_OIDS.CollectionType=OracleCollectionType.PLSQLAssociativeArray;for(inti=0;i<10;i ){longa=((Oracle.DataAccess.Types.OracleDecimal[])v_OIDS.Value)[i].ToInt64();}或者for(inti=0;i<10;i ){longa=((Oracle.DataAccess.Types.OracleDecimal)(v_OIDS.ValueasArray).GetValue(i)).ToInt64();}6.在调用存储过程时,假如输入参数为数组,则长度不能为0,数组也不能为null
这里主要想归纳一下通过OracleCommand调用存储过程的方法。
首先设置CommandText属性为存储过程的名称。注意带package名
其次将CommandType 属性设为System.Data.CommandType.StoredProcedure
然后填入相应的参数。参数可以为oracle的各种类型。
通过下面例子说明如何调用oracle的数组参数和cursor参数。
//PL/SQL
//--------------------------------------------------------
//Oracle服务器上 存储过程
//包含三个参数。
//I_ID 输入参数 VARCHAR2 类型
//I_TBL 输入参数 VARCHAR(10) 型的数组
//O_CUR 输出参数 cursor 类型
CREATE OR REPLACE PACKAGE JK_WAIN_0203.PKG_TEST IS
TYPE TYPE_TAB_111 IS TABLE OF VARCHAR(10) INDEX BY BINARY_INTEGER;
PROCEDURE PROC_GET_DATA(
I_ID IN VARCHAR2, //
I_TBL IN TYPE_TAB_111,
O_CUR OUT SYS_REFCURSOR);
END PKG_TEST;
/
CREATE OR REPLACE PACKAGE BODY JK_WAIN_0203.PKG_TEST IS
PROCEDURE PROC_GET_DATA(
I_ID IN VARCHAR2,
I_TBL IN TYPE_TAB_111,
O_CUR OUT SYS_REFCURSOR)
IS
V_INDEX NUMBER := 0;
V_INDEX_MAX NUMBER := 0;
V_DATA VARCHAR(10);
BEGIN
V_INDEX := I_TBL.FIRST;
V_INDEX_MAX := I_TBL.LAST;
WHILE V_INDEX <= V_INDEX_MAX LOOP
V_DATA := I_TBL(V_INDEX);
V_INDEX := V_INDEX + 1;
END LOOP;
OPEN O_CUR FOR SELECT * FROM TAB WHERE ROWNUM < 10;
END PROC_GET_DATA;
END PKG_TEST;
/
---------------------------------------------------------------------------
//C#例
public void Get_PrecedureData()
{
OracleConnection connection = null;//Connection
OracleCommand oraCommand = new OracleCommand();
OracleParameter paramId = null;
OracleParameter paramTbl = null;
OracleParameter paramCur = null;
OracleRefCursor pInfoCur = null;
DataSet dtRtn = new DataSet();
//数据库连接
connection = new OracleConnection("User Id=scott;Password=tiger;Data Source=oracle");
connection.Open();
oraCommand.Connection = connection;
oraCommand.Parameters.Clear();
// 存储过程 设定
oraCommand.CommandText = "PKG_TEST.PROC_GET_DATA";
oraCommand.CommandType = System.Data.CommandType.StoredProcedure;
// 输入输出参数设定
// Varchar2型
paramId = oraCommand.Parameters.Add( "I_ID", OracleDbType.Varchar2, ParameterDirection.Input );
// 数组类型参数设定
paramTbl = oraCommand.Parameters.Add( "I_TBL", OracleDbType.Varchar2, ParameterDirection.Input );
// 将CollectionType 设为 PLSQLAssociativeArray
paramTbl.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
//cursor 类型参数设定
paramCur = oraCommand.Parameters.Add("O_CUR", OracleDbType.RefCursor, ParameterDirection.Output );
//设置参数数组的大小
//注意:参数的Value 属性和ArrayBindSize 属性必须为元素个数相同的数组,且个数等于参数的Size 属性
int[] bindSize = new int[10];
string[] tblData = new string[10];
for(int ii = 0; ii < 10; ii++)
{
tblData[ii] = ii.ToString();//数值
bindSize[ii] = 10;//数值的大小
}
//数组参数设定
paramTbl.Value = tblData;
paramTbl.Size = 10;
paramTbl.ArrayBindSize = bindSize;
//存储过程执行
oraCommand.ExecuteNonQuery();
//out的cursor值的读取
using(OracleDataAdapter da = new OracleDataAdapter())
{
if(paramCur.Value != System.DBNull.Value)
{
pInfoCur = (OracleRefCursor)paramCur.Value;
da.Fill(dtRtn, pInfoCur);
}
//取得记录数
Console.WriteLine("the number of record count is {0}", dtRtn.Tables[0].Rows.Count);
}
oraCommand.Dispose();
connection.Close();
connection.Dispose();
}