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

问题描述:

在oracle数据库中,我在包中创建了一个自定义类型,我猜这个类型与整数数组类似。如何在oracle中调用与包类型参数的过程?

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

过程中使用的类型IN参数和期望出参数大小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并调用上述过程。

+0

您可以简单地定义所需类型的一些变量,然后调用过程。你有什么问题? – Aleksej

执行上述过程与传递到自定义类型的整数列表

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 

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

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 

用同样的方法,你可以建立你的存储过程,包,...打电话给你的程序。

+0

它的工作,谢谢aleksej.Adding到这个问题,你有想法如何通过在java java.sql.CallableStatement执行这样的程序(程序有自定义类型)? –

这里是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