当前位置:  开发笔记 > 编程语言 > 正文

带有IN子句参数的Oracle存储过程

如何解决《带有IN子句参数的Oracle存储过程》经验,为你挑选了1个好方法。

如何创建一个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功能兼容.

谢谢,罗伯特



1> Ashley Merce..:

使用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开发人员遇到这个问题.


快速说明 - CSV本身不起作用,因为Oracle会将其视为一个字符串.
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有