将数据集合传递给.NET中的PL / SQL包过程或函数?

时间:2009-08-27 18:39:15

标签: c# .net vb.net oracle plsql

我有一个表,我需要根据用户输入插入一组记录。 IE:从可供选择的项目列表中选择。对于这个例子,我们只是说它是int的集合。

互联网上没有很多好的例子。 There's only one related question here on SO,但它也没有给出答案(两个答案都是死路一条)。

  1. 如何通过.NET设置对Package的调用?
  2. 如何设置包过程或函数以接收集合?
  3. 如何在过程或函数内部处理集合?

3 个答案:

答案 0 :(得分:1)

上次我不得不从.NET使用Oracle时,我非常重视Mark A. Williams的Pro .NET Oracle编程。那已经4年或更长时间了,但我发现它写得很好而且很有用。

答案 1 :(得分:1)

查看odp.net的Oracle technet how to部分。有一个绑定数组的示例。但该程序被称为n次。 plsql过程的参数是普通类型(valuetype)。

还有另一个传递array at once的例子。 plsql过程的参数是plsql表。处理集合(= plsql表)描述为her。这可能更适合你的问题。

答案 2 :(得分:0)

虽然我不能从.NET的角度讲,但我遇到过与Java代码类似的问题。也许这个解决方案会有用......

首先在数据库中创建一个能够存储元素集合的新TYPE。我通常使用TABLE类型:

CREATE TYPE my_array_type IS TABLE OF NUMBER
    INDEX BY BINARY_INTEGER;

然后创建一个能够接受MY_ARRAY_TYPE类型参数的过程:

CREATE PROCEDURE process_array(my_array MY_ARRAY_TYPE) IS
  i BINARY_INTEGER;
  my_array_element NUMBER;
BEGIN
  i := my_array.FIRST;
  WHILE my_array.EXISTS(i) LOOP
    my_array_element := my_array(i);
    /* do something with my_array_element... */
    i := my_array.NEXT(i);
  END LOOP;
END;

下一个技巧是用您选择的编程语言(我假设VB.NET或C#)动态构建一个匿名PL / SQL块并执行它。我不能说.NET,但这是Java中的一个例子:

int[] myArray = ...;

StringBuilder plsql = new StringBuilder();
plsql.append("DECLARE");
plsql.append("  my_array MY_ARRAY_TYPE;");
plsql.append("BEGIN");
for (int i = 0; i < myArray.length; i++) {
    plsql.append("  my_array(" + i + ") := ?;");
}
plsql.append("  PROCESS_ARRAY(my_array);");
plsql.append("END");

CallableStatement statement = connection.prepareCall(plsql.toString());
for (int i = 0; i < myArray.length; i++) {
    statement.setInt(i + 1, myArray[i]);
}

statement.execute();

我知道有更好的方法,但这似乎是最可靠的,特别是在Java / JDBC世界中,只有Oracle的所有JDBC驱动程序(!)的子集都支持集合类型。