向程序发送多组参数

时间:2014-09-16 12:54:03

标签: vb.net oracle stored-procedures parameters

我正在使用vb.net和oracle db,目前我有一个从我的代码调用的存储过程。现在它看起来与此相似:

CREATE OR REPLACE PROCEDURE MYPROCEDURE(
param1   table.field1%TYPE,
param2   table.field2%TYPE,
param3   table.field3%TYPE,
param4   varchar2,
output   OUT number) AS

BEGIN
  DO STUFF
END;

我想询问是否可以将其更改为一次发送多组参数,因此我可以在我的程序中使用FOR LOOP来最小化调用次数。我希望实现这样的目标:

CREATE OR REPLACE PROCEDURE MYPROCEDURE(
param    myArray
output   OUT number) AS

BEGIN
  FOR i IN 1..myArray.COUNT LOOP
     UPDATE FIELD FROM TABLE WHERE ID = myArray(i).field1;
  END LOOP;
END;

或者,如果还有其他任何可行的方法,那就太好了。

非常感谢。

1 个答案:

答案 0 :(得分:1)

是的,您可以在oracle过程中将对象列表作为参数传递。首先,您必须创建此对象列表的数据类型,但是您必须在必须将其定义为oracle对象的过程中执行此操作。例如:

CREATE OR REPLACE TYPE TEST."MY_TYPE" AS OBJECT
                  (PARAM1 VARCHAR (20), PARAM2 NUMBER);

不幸的是你可以在对象中定义动态数据类型(table.field1%TYPE),但我想你知道这个字段有什么数据类型。

其次,创建一个包含参数和过程定义列表的包,如下所示:

CREATE OR REPLACE PACKAGE ARRAY_EXAMPLE2
AS
   TYPE COL IS TABLE OF MY_TYPE;

   PROCEDURE PROCESS_ARRAY (ArrayIn IN COL);
END;

最后是包实现

CREATE OR REPLACE PACKAGE BODY ARRAY_EXAMPLE2
AS
   PROCEDURE PROCESS_ARRAY (ArrayIn IN COL)
   IS
   BEGIN
      FOR i IN 1 .. ArrayIn.COUNT
      LOOP
         DBMS_OUTPUT.PUT_LINE ('Hello ' || ArrayIn (i).PARAM1);
      END LOOP;
   END;
END;

您可以使用以下代码行尝试:

BEGIN
   ARRAY_EXAMPLE2.
    PROCESS_ARRAY (
      array_example2.
       COL (MY_TYPE ('Peter', 12),
            MY_TYPE ('Jorge', 4),
            MY_TYPE ('Bryan', 5)));
END;