如何在oracle中调用带有包类型参数的过程?

How to call procedure with package type param in oracle?

在 oracle DB 中,我在包中创建了一个自定义类型,我猜这个类型类似于整数数组。

create or replace PACKAGE mypackage AS 
   TYPE custom1 is table of integer index by binary_integer;
END mypackage;

在过程 IN 参数中使用了类型并期望输出参数为 IN 参数的大小。

CREATE OR REPLACE PROCEDURE MYPROCEDURE( param1 in mypackage.custom1, count1 out integer) IS
begin
count1 := param.count();
END MYPROCEDURE

现在我想调用上面的过程,为此我应该准备mypackage.custom1。

请帮我构建mypackage.custom1并调用上面的过程。

您的代码有一些错误;

CREATE OR REPLACE PACKAGE mypackage AS
    TYPE custom1 IS TABLE OF INTEGER
        INDEX BY BINARY_INTEGER;
END mypackage;

CREATE OR REPLACE PROCEDURE MYPROCEDURE(param1 IN mypackage.custom1, count1 OUT INTEGER) IS
BEGIN
    count1    := param1.COUNT();
END MYPROCEDURE;

要调用您的过程,您只需定义两个变量并使用它们调用过程;例如,在匿名块中:

declare
    v mypackage.custom1;
    n number;
begin
    select 1
    bulk collect into v
    from dual connect by level <= 5;    
    --
    MYPROCEDURE(v, n);
    dbms_output.put_line('n= ' || n);
end;

n= 5

同样,您可以构建存储过程、程序包...来调用您的过程。

使用传递给自定义类型的整数列表执行上述过程

SET SERVEROUTPUT = ON;
declare
    v mypackage.custom1;
    n number;
begin
    v(0) := 10;
    v(1) := 12;
    v(2) := 14;
    v(3) := 16;  
    --
    MYPROCEDURE(v, n);
    dbms_output.put_line('n= ' || n);
end;

输出:

n = 4

这是调用上述过程的JDBC代码

String procedure = "call MYPROCEDURE(?, ?)";
CallableStatement callableStatement = con.prepareCall(procedure);
ArrayDescriptor ad = ArrayDescriptor.createDescriptor("mypackage.custom1", con);
ARRAY arr = new ARRAY(ad, con, new Integer[]{1,2,3,4});
callableStatement.setArray(1, arr);
callableStatement.registerOutParameter(2, Types.INTEGER);

final boolean execute = callableStatement.execute();
System.out.println("No of entries :" + callableStatement.getObject(2));

输出:

条目数:4