如何在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并调用上述过程。
答
执行上述过程与传递到自定义类型的整数列表
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
您可以简单地定义所需类型的一些变量,然后调用过程。你有什么问题? – Aleksej