我正在使用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;
或者,如果还有其他任何可行的方法,那就太好了。
非常感谢。
答案 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;