我已经创建了一个测试此问题的过程,它在oracle开发人员中正常工作。有一个名为" dizi" (array和varchar2)。并且程序有输入参数。我试图将一个数组作为参数传递给此程序作为c#中的参数。我经常搜索但我无法解决问题。错误是:"并非所有序列都绑定了"
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;
答案 0 :(得分:0)
我已经有成功将数组传递给oracle sprocs的代码。对你的方法略有不同。不完全确定多少是相关的,但如果它有助于我的代码:
那就是说,我怀疑你的问题可能是你在调用程序时使用绑定变量。如果你只是将'TESTPROCEDURE'设置为CommandText,会发生什么?
或者转向其他方式并将其更改为正确的匿名PLSQL块'开始TESTPROCEDURE(:area_array);结束;'并将CommandType更改为CommandType.Text(正如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();
}