如何创建一个Oracle存储过程,该过程接受用于提供IN子句的可变数量的参数值?
这就是我想要实现的目标.我不知道如何在PLSQL中声明传递我想要更新的行的主键的变量列表.
FUNCTION EXECUTE_UPDATE (value IN int) RETURN int IS BEGIN [...other statements...] update table1 set col1 = col1 - value where id in ( ) RETURN SQL%ROWCOUNT ; END;
另外,我想从C#调用此过程,因此它必须与.NET功能兼容.
谢谢,罗伯特
使用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开发人员遇到这个问题.