2016-11-22 2 views
-1

В oracle DB я создал пользовательский тип в пакете, и я предполагаю, что этот тип похож на целочисленный массив.Как вызвать процедуру с типом пакета param в oracle?

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

Использованный тип в процедуре IN param и ожидающий параметр, чтобы быть размером 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

ответ

-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 
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 

Точно так же, вы можете создать хранимые процедуры, пакеты, ... для вызова процедуры.

+0

Это сработало, спасибо aleksej.Adding к этому вопросу, у вас есть идея о том, как выполнять такие процедуры (процедуры с настраиваемыми типами) через java.sql.CallableStatement в java? –

-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

Смежные вопросы