我已经创建了一个过程来测试这个问题,它在oracle开发人员中正常工作。有一个名为"dizi"的类型(数组和varchar2)。程序有输入参数。我试图将一个数组传递给这个过程作为c#中的参数。我找了很多,但还是没能解决这个问题。错误是:"Not all variables bound"
public void InsertQuestion(List<string> area_list)
{
quest_areas = area_list.ToArray();
command = new OracleCommand();
command.Connection = connect;
connect.Open();
var arry = command.Parameters.Add("area_array",OracleDbType.Varchar2);
arry.Direction = ParameterDirection.Input;
arry.Size = quest_areas.Length;
arry.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
arry.Value = quest_areas;
command.BindByName = true;
command.CommandText ="TESTPROCEDURE(:area_array)";
command.CommandType = CommandType.StoredProcedure;
command.ExecuteNonQuery();
connect.Close();
}
这是我的程序(这只是为了测试,但我会使用类似的东西)
CREATE OR REPLACE PROCEDURE TESTPROCEDURE (t_in IN dizi)
IS
BEGIN
FOR i IN 1..t_in.count LOOP
dbms_output.put_line(t_in(i));
END LOOP;
END;
我已经成功地将数组传递到oracle进程的代码。和你的方法略有不同。不完全确定有多少是相关的,但如果它有助于我的代码:
- 使用正确的名称参数名称(在您的情况下是t_in)
- 不需要设置参数 的大小。
- 创建一个正确长度的对象数组,并将内容复制到其中(即在您的情况下从quest_areas)
- 然后将此对象数组设置为命令参数 的值。
- 在调用进程时不使用绑定变量,而只是使用进程名称本身作为命令文本。
也就是说,我怀疑您的问题可能与调用过程时使用绑定变量有关。如果您将'TESTPROCEDURE'设置为CommandText,会发生什么?
或者用另一种方式,把它修改成一个合适的匿名PLSQL块'begin TESTPROCEDURE(:area_array);并将CommandType更改为CommandType。文本(正如Wernfried在我打字时建议的那样…)
public void InsertQuestion(List<string> area_list)
{
var input_array = area_list.Select(s => (object)s).ToArray();
command = new OracleCommand();
command.Connection = connect;
connect.Open();
var arry = command.Parameters.Add("area_array",OracleDbType.Varchar2);
arry.Direction = ParameterDirection.Input;
arry.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
arry.Value = input_array;
command.CommandText ="TESTPROCEDURE";
command.CommandType = CommandType.StoredProcedure;
command.ExecuteNonQuery();
connect.Close();
}