首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

c#向pl/sql传送数组参数

2012-07-22 
c#向pl/sql传递数组参数1.OracleParameterpout1OracleDbType.Varchar2,50)3.数组的参数类型为OracleColl

c#向pl/sql传递数组参数

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();
}

?

?

热点排行