无法将数组传递给预言机过程



我已经创建了一个过程来测试这个问题,它在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();
    }

最新更新