Как получить пользовательские типы таблиц из PLSQL как out-param? - PullRequest
1 голос
/ 09 марта 2012

У меня есть код PLSQL со следующей подписью.

procedure getall(
   p_id               in number,
   p_code             in varchar2,
   x_result           out tt_objs);

type rt_obj is record(
    val1              mytable.attr1%type
    val2              mytable.attr2%type
    val3              mytable.attr2%type
);

type tt_objs is table of rt_obj index by binary_integer;

Каким должен быть код Java, который может вызвать эту процедуру и прочитать x_result?

Ответы [ 2 ]

2 голосов
/ 09 марта 2012

Может быть это может быть то, что вы ищете.

Это должно быть интересной частью:

//oracle.sql.ARRAY we will use as out parameter from the package
//and will store pl/sql table
ARRAY message_display = null; 

//ArrayList to store object of type struct 
ArrayList arow= new ArrayList();

//StructDescriptor >> use to describe pl/sql object
//type in java.
StructDescriptor voRowStruct = null; 

//ArrayDescriptor >> Use to describe pl/sql table
//as Array of objects in java
ArrayDescriptor arrydesc = null;

//Input array to pl/sql procedure
ARRAY p_message_list = null;

//Oracle callable statement used to execute procedure
OracleCallableStatement cStmt=null;

try
{
//initializing object types in java.
voRowStruct = StructDescriptor.createDescriptor("RECTYPE",conn); 
arrydesc = ArrayDescriptor.createDescriptor("RECTAB",conn);
}

catch (Exception e)
{
throw OAException.wrapperException(e);
}

for(XXVORowImpl row = (XXVORowImpl)XXVO.first(); 
row!=null;
row = (XXVORowImpl)XXVO.next())
{
//We have made this method to create struct arraylist
// from which we will make ARRAY
//the reason being in java ARRAY length cannot be dynamic
//see the method defination below.
populateObjectArraylist(row,voRowStruct,arow); 
}

//make array from arraylist
STRUCT [] obRows= new STRUCT[arow.size()];
for(int i=0;i < arow.size();i++)
{
obRows[i]=(STRUCT)arow.get(i);
}

try 
{
p_message_list = new ARRAY(arrydesc,conn,obRows); 
}
catch (Exception e)
{
throw OAException.wrapperException(e);
}

//jdbc code to execute pl/sql procedure 
try
{
cStmt
=(OracleCallableStatement)conn.prepareCall("{CALL ioStructArray.testproc(:1,:2)}"); 
cStmt.setArray(1,p_message_list);
cStmt.registerOutParameter(2,OracleTypes.ARRAY,"RECTAB"); 
cStmt.execute();

//getting Array back
message_display = cStmt.getARRAY(2);
//Getting sql data types in oracle.sql.datum array
//which will typecast the object types
Datum[] arrMessage = message_display.getOracleArray();

//getting data and printing it
for (int i = 0; i < arrMessage.length; i++)
{ 
oracle.sql.STRUCT os = (oracle.sql.STRUCT)arrMessage[i];
Object[] a = os.getAttributes(); 
System.out.println("a [0 ] >>attribute1=" + a[0]); 
System.out.println("a [1 ] >>attribute2=" + a[1]);
System.out.println("a [2 ] >>attribute3=" + a[2]);
1 голос
/ 04 июня 2012

Да, это невозможно напрямую.Вы можете либо

  • Создать открытый тип с такой же структурой, что и запись PLSQL, и следовать совету Eggi.Аналогичный подход использует Oracle JPublisher .JPublisher может помочь вам автоматизировать этот процесс.
  • Или вы можете использовать анонимный блок PLSQL для создания или чтения записей PLSQL.Мы думаем о том, чтобы создать библиотеку, сделать это автоматически в нашей компании.
  • Или вы можете создать функции-оболочки для преобразования записей в XML (как в Java, так и в PLSQL).Затем передайте XML как Xmltype или CLOB между БД и Java.У нас уже есть это решение для некоторых сложных структур.Это утомительно и немного замедляет обработку, но работает.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...