我有一个表,我需要根据用户输入插入一组记录。 IE:从可供选择的项目列表中选择。对于这个例子,我们只是说它是int的集合。
互联网上没有很多好的例子。 There's only one related question here on SO,但它也没有给出答案(两个答案都是死路一条)。
答案 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驱动程序(!)的子集都支持集合类型。