无法将数组传递给oracle过程

时间:2016-10-27 11:44:14

标签: c# arrays oracle stored-procedures

我已经创建了一个测试此问题的过程,它在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;

1 个答案:

答案 0 :(得分:0)

我已经有成功将数组传递给oracle sprocs的代码。对你的方法略有不同。不完全确定多少是相关的,但如果它有助于我的代码:

  • 使用正确的名称参数名称(在您的情况下为t_in)
  • 不打扰设置参数的大小
  • 创建一个正确长度的对象数组,并将内容复制到其中(即从您的案例中的quest_areas)
  • 然后将此对象数组设置为命令参数的值
  • 在调用proc时不使用绑定变量,而只是将proc名称本身用作CommandText。

那就是说,我怀疑你的问题可能是你在调用程序时使用绑定变量。如果你只是将'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();
    }