如何在oracle中使用包类型param调用过程?

时间:2016-11-22 13:21:50

标签: sql oracle stored-procedures procedure

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

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

在过程IN param中使用类型,并期望param为IN param的大小。

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

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

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

3 个答案:

答案 0 :(得分:1)

您的代码中存在一些错误;

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

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

答案 1 :(得分:-1)

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

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

答案 2 :(得分:-1)

以下是调用上述过程的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