使用 CSV 可能是最简单的方法,假设您可以 100% 确定您的元素本身不会包含字符串。
另一种可能更健壮的方法是创建一个自定义类型作为字符串表。假设您的字符串永远不会超过 100 个字符,那么您可以:
CREATE TYPE string_table AS TABLE OF varchar2(100);
然后,您可以将这种类型的变量传递到您的存储过程中并直接引用它。在你的情况下,是这样的:
FUNCTION EXECUTE_UPDATE(
identifierList string_table,
value int)
RETURN int
IS
BEGIN
[...other stuff...]
update table1 set col1 = col1 - value
where id in (select column_value from table(identifierList));
RETURN SQL%ROWCOUNT;
END
该table()
函数将您的自定义类型转换为具有单列“COLUMN_VALUE”的表,然后您可以将其视为任何其他表(连接或在本例中为子选择)。
这样做的好处是 Oracle 会为您创建一个构造函数,因此在调用您的存储过程时,您可以简单地编写:
execute_update(string_table('foo','bar','baz'), 32);
我假设您可以从 C# 以编程方式构建此命令。
顺便说一句,在我的公司,我们有许多自定义类型被定义为字符串、双精度、整数等列表的标准。我们还利用Oracle JPublisher能够直接从这些类型映射到相应的 Java 对象。我快速浏览了一下,但看不到 C# 的任何直接等效项。只是想我会提到它,以防 Java 开发人员遇到这个问题。