假设有这样的存储过程,其主要功能为调用execute immediate sql来完成语句的执行。
procedure proc2(sql in varchar2(50));
在应用层通过OracleCommand,OracleParameter调用此存储过程
OracleConnection oc = new OracleConnection(strConnection);
oc.Open();
OracleCommand om = oc.CreateCommand();
om.CommandType = CommandType.StoredProcedure;
om.CommandText = "proc2";
om.Parameters.Add("sql", OracleType.Number).Direction = ParameterDirection.Input;
om.Parameters["sql"].Value = "select * from table1";
现在的问题是:如何在执行动态sql语句的时候传入参数?
比如:sql="insert into table values(:x,:y,:z)";此时需要传入3个参数。
那么在传入的参数类型不确定,个数也不确定的情况下又该怎么做?
存储过程可以修改,C#中的类可以继承。望各位大侠帮帮忙啊
------解决思路----------------------
最简单的,不用那个存储过程了,直接在程序中构造整个
execute immediate sql_state using var1,var2,...
语句,然后传过去执行不就行了.
------解决思路----------------------
把这几个参数都动态的拼接到字符串中。
------解决思路----------------------
为了解决这个问题:
1、把存储过程的参数都定义为varchar2类型
2、c#用参数数值来调用
#region 调用存储过程 public int ExecuteProcedure(string ProcedureName,string[][] Params)
/// <summary>
/// 调用存储过程(参数类型都为input,并且皆为varchar,请在存储过程内转换为您所需的类型)
/// 调用方式如下:
///string[][] Params = new string[][]
/// {
/// new string[] {"kssj","2006-01-01"},
/// new string[] {"Ygdl","45.2584"}
/// };
///int res = ExecuteProcedure("Pro_Test",Params);
///
/// </summary>
/// <param name="ProcedureName">存储过程名称</param>
/// <param name="Params">存储过程参数数组</param>
/// <returns></returns>
public int ExecuteProcedure(string ProcedureName, string[][] Params)
{
int res = -1;
try
{
this.DBConnection();
this.cmd.BindByName = true;
this.cmd.CommandText = ProcedureName;
this.cmd.CommandType = CommandType.StoredProcedure;
int count = Params.Length;
for (int i = 0; i < count; i++)
{
this.cmd.Parameters.Add(Params[i][0], OracleDbType.Varchar2).Value = Params[i][1];
}
res = this.cmd.ExecuteNonQuery();
}
catch (Exception e)
{
throw (e);
}
finally
{
this.DBDisconnection();
this.conn.Dispose();
}
return res;
}
#endregion