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

Posted

技术标签:

【中文标题】将数据集合从 .NET 传递给 PL/SQL 包过程或函数?【英文标题】:Pass collections of data to PL/SQL Package Procedure or Function from .NET? 【发布时间】:2009-08-27 18:39:15 【问题描述】:

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

互联网上没有很多好的例子。 There's only one related question here on SO,但它也没有提供任何答案(两个答案都是死胡同)。

    如何设置从 .NET 到 Package 的调用? 如何设置包过程或函数来接收集合? 在过程或函数内部如何处理集合?

【问题讨论】:

【参考方案1】:

上次我不得不从 .NET 与 Oracle 合作时,我非常了解 Mark A. Williams 的 Pro .NET Oracle Programming。已经有 4 年或更长时间了,但我发现它写得很好并且非常有用。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

虽然我不能从 .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 驱动程序 (!) 中只有一部分支持集合类型。

【讨论】:

连接用户输入?它在哪里这样做?唯一的串联是i 变量。用户输入通过语句参数分配。

以上是关于将数据集合从 .NET 传递给 PL/SQL 包过程或函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何传递从多个表创建的 PL/SQL 游标记录?

PL/SQL:, 如何将变量传递给 SELECT 语句并返回所有结果行

oracle pl/sql 将异常类型传递给函数

odp.net 可以将参数传递给布尔 pl/sql 参数吗?

每个将表名传递给过程的 ORACLE PL/SQL

将常规 CURSOR 传递给需要 SYS_REFCURSOR 的 PL/SQL 过程