[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
| 
Re: [eclipselink-users] How to call some procedures which has an 	associative array as an argument.
 | 
Thanks for your advice. it helped us.
We change the wrapper type from TABLE to VARRAY.
it solved our problem.
thank you.
2010/4/7 James Sutherland <jamesssss@xxxxxxxxx>:
>
> I think your issue is your wrapper type must be a VARRAY not a TABLE type.
>
>>> CREATE OR REPLACE TYPE xxz_test001_rec_tbl_type AS TABLE OF
>>> xxz_test001_rec;
> CREATE OR REPLACE TYPE xxz_test001_rec_tbl_type AS VARRAY(255) OF
> xxz_test001_rec;
>
> Otherwise you may want to try to simplify the query/call to narrow down the
> issue.
>
> There are some examples in our tests in SVN
> <root>\foundation\eclipselink.core.test\src\org\eclipse\persistence\testing\models\plsql
>
>
> oratta wrote:
>>
>> Hi,
>>
>> We have a problem to call some procedures which has an associative
>> array  as an argument.
>> In our project, Eclipselink 1.2.0 (included in TopLink 11.1.1.2.0) is
>> used on OC4J 10.1.3.5.
>> Could someone help us?
>>
>> The procedure is as follow.
>> [[PL/SQL Package]]
>> CREATE OR REPLACE PACKAGE XXZ_TEST_PKG AS
>>     TYPE test001_rec IS RECORD (
>>               column01 VARCHAR2(10),
>>               column02 NUMBER);
>>     TYPE test001_rec_tbl_type IS TABLE OF test001_rec INDEX BY
>> PLS_INTEGER;
>>     PROCEDURE procedure_tab_index(
>>             input IN NUMBER,
>>             output OUT VARCHAR2,
>>             inputoutput IN OUT test001_rec_tbl_type);
>> END XXZ_TEST_PKG;
>>
>> Firstly we defined shadow types in the 'global' JDBC namespace outside
>> of the PL/SQL package.
>> [[Shadow Type]]
>> CREATE OR REPLACE TYPE xxz_test001_rec AS OBJECT (
>>               column01 VARCHAR2(10),
>>               column02 NUMBER);
>> CREATE OR REPLACE TYPE xxz_test001_rec_tbl_type AS TABLE OF
>> xxz_test001_rec;
>>
>> Secondly we make some Java DTO class for mapping the PL/SQL record
>> type and PL/SQL associative array.
>> [[Java DTO ]]
>> public class PLSQLHelperTestRecDTO1 implements Serializable{
>>     private String column01;
>>     private Long column02;
>> }
>> public class PLSQLHelperTestTableIndexDTO  implements Serializable{
>>     private PLSQLHelperTestRecDTO1[] nest;
>> }
>>
>> Finally we implements Java method to call the procedure.
>> [[Java method ]]
>>                 /*Descriptor for mapping nested Record*/
>>                 ObjectRelationalDataTypeDescriptor nestedRecordDesc =
>> new ObjectRelationalDataTypeDescriptor();
>>                 nestedRecordDesc.descriptorIsAggregate();
>>
>> nestedRecordDesc.setJavaClass(PLSQLHelperTestRecDTO1.class);
>>                 nestedRecordDesc.setAlias("NestedRecord");
>>                 nestedRecordDesc.setStructureName("XXZ_TEST001_REC");
>>                 DirectToFieldMapping value01Mapping = new
>> DirectToFieldMapping();
>>                 value01Mapping.setAttributeName("column01");
>>                 value01Mapping.setFieldName("COLUMN01");
>>                 nestedRecordDesc.addMapping(value01Mapping);
>>                 DirectToFieldMapping value02Mapping = new
>> DirectToFieldMapping();
>>                 value02Mapping.setAttributeName("column01");
>>                 value02Mapping.setFieldName("COLUMN02");
>>                 nestedRecordDesc.addMapping(value02Mapping);
>>
>> JpaHelper.getEntityManager(em).getServerSession().addDescriptor(nestedRecordDesc);
>>
>>                 /*Descriptor for mapping Associative Array*/
>>                 ObjectRelationalDataTypeDescriptor recordDescriptor =
>> new ObjectRelationalDataTypeDescriptor();
>>                 recordDescriptor.descriptorIsAggregate();
>>
>> recordDescriptor.setJavaClass(PLSQLHelperTestTableIndexDTO.class);
>>
>> nestedRecordDesc.setStructureName("XXZ_TEST001_REC_TBL_TYPE");
>>                 recordDescriptor.setAlias("TableIndex");
>>
>> JpaHelper.getEntityManager(em).getServerSession().addDescriptor(recordDescriptor);
>>
>>                 PLSQLrecord inRecordNest = new PLSQLrecord();
>>                 inRecordNest.setTypeName("XXZ_TEST_PKG.TEST001_REC");
>>                 inRecordNest.setCompatibleType("XXZ_TEST001_REC");
>>                 inRecordNest.setJavaType(PLSQLHelperTestRecDTO1.class);
>>                 inRecordNest.addField("COLUMN01", JDBCTypes.VARCHAR_TYPE);
>>                 inRecordNest.addField("COLUMN02", JDBCTypes.NUMERIC_TYPE);
>>
>>                 PLSQLCollection inRecord = new PLSQLCollection();
>>                 inRecord.setTypeName("XXZ_TEST_PKG.TEST001_REC_TBL_TYPE");
>>                 inRecord.setCompatibleType("XXZ_TEST001_REC_TBL_TYPE");
>>                 inRecord.setJavaType(PLSQLHelperTestTableIndexDTO.class);
>>                 inRecord.setNestedType(inRecordNest);
>>
>>                 PLSQLStoredProcedureCall call = new
>> PLSQLStoredProcedureCall();
>>                 call.setProcedureName("XXZ_TEST_PKG.procedure_tab_index");
>>                 call.addNamedArgument("INPUT",JDBCTypes.NUMERIC_TYPE);
>>                 call.addNamedOutputArgument("OUTPUT",
>> JDBCTypes.VARCHAR_TYPE);
>>                 call.addNamedInOutputArgument("INPUTOUTPUT", inRecord);
>>                 ValueReadQuery query = new ValueReadQuery();
>>                 query.addArgument("INPUT");
>>                 query.addArgument("INPUTOUTPUT",
>> PLSQLHelperTestTableIndexDTO.class);
>>
>>                 query.setCall(call);
>>                 query.setResultType(DataReadQuery.ARRAY);
>>                 query.bindAllParameters();
>>
>>                 PLSQLHelperTestRecDTO1 nestedRec = new
>> PLSQLHelperTestRecDTO1();
>>                 nestedRec.setColumn01("Test");
>>                 nestedRec.setColumn02(1L);
>>
>>                  PLSQLHelperTestTableIndexDTO rec = new
>> PLSQLHelperTestTableIndexDTO();
>>                 rec.setNest(new PLSQLHelperTestRecDTO1[] {nRec});
>>
>>                 List attributes = new ArrayList();
>>                 attributes.add(in);
>>                 attributes.add(rec);
>>
>>                 List attributes = new ArrayList();
>>                 attributes.add(in);
>>                 attributes.add(rec);
>>                 Object returnObject =
>> JpaHelper.getEntityManager(em).getServerSession().executeQuery(query,
>> attributes);
>>
>>
>> But, we cannot call ther procedure because of this error, as follow.
>> How can I do this?
>> Sorry for my poor English.
>>
>> best regards.
>>
>>
>> [[Error message]]
>> Exception [EclipseLink-4002] (Eclipse Persistence Services -
>> 1.2.0.v20091016-r5565):
>> org.eclipse.persistence.exceptions.DatabaseException
>> Internal Exception: java.sql.SQLException: 列の型が無効です。
>> Error Code: 17004
>> Call:
>> DECLARE
>>   input_TARGET NUMERIC := :1;
>>   inputoutput_TARGET XXZ_TEST_PKG.TEST001_REC_TBL_TYPE;
>>   inputoutput_COMPAT XXZ_TEST001_REC_TBL_TYPE := :2;
>>   output_TARGET VARCHAR(255);
>>   FUNCTION EL_SQL2PL_1(aSqlItem XXZ_TEST001_REC)
>>   RETURN XXZ_TEST_PKG.TEST001_REC IS
>>     aPlsqlItem XXZ_TEST_PKG.TEST001_REC;
>>   BEGIN
>>     aPlsqlItem.column01 := aSqlItem.column01;
>>     aPlsqlItem.column02 := aSqlItem.column02;
>>     RETURN aPlsqlItem;
>>   END EL_SQL2PL_1;
>>   FUNCTION EL_PL2SQL_0(aPlsqlItem XXZ_TEST_PKG.TEST001_REC)
>>   RETURN XXZ_TEST001_REC IS
>>     aSqlItem XXZ_TEST001_REC;
>>   BEGIN
>>     aSqlItem := XXZ_TEST001_REC(NULL, NULL);
>>     aSqlItem.column01 := aPlsqlItem.column01;
>>     aSqlItem.column02 := aPlsqlItem.column02;
>>     RETURN aSqlItem;
>>   END EL_PL2SQL_0;
>>   FUNCTION EL_SQL2PL_3(aSqlItem XXZ_TEST001_REC_TBL_TYPE)
>>   RETURN XXZ_TEST_PKG.TEST001_REC_TBL_TYPE IS
>>     aPlsqlItem XXZ_TEST_PKG.TEST001_REC_TBL_TYPE;
>>   BEGIN
>>     IF aSqlItem.COUNT > 0 THEN
>>       FOR I IN 1..aSqlItem.COUNT LOOP
>>         aPlsqlItem(I) := EL_SQL2PL_1(aSqlItem(I));
>>       END LOOP;
>>     END IF;
>>     RETURN aPlsqlItem;
>>   END EL_SQL2PL_3;
>>   FUNCTION EL_PL2SQL_2(aPlsqlItem XXZ_TEST_PKG.TEST001_REC_TBL_TYPE)
>>   RETURN XXZ_TEST001_REC_TBL_TYPE IS
>>     aSqlItem XXZ_TEST001_REC_TBL_TYPE;
>>   BEGIN
>>     aSqlItem := XXZ_TEST001_REC_TBL_TYPE();
>>     aSqlItem.EXTEND(aPlsqlItem.COUNT);
>>     IF aPlsqlItem.COUNT > 0 THEN
>>     FOR I IN aPlsqlItem.FIRST..aPlsqlItem.LAST LOOP
>>       aSqlItem(I + 1 - aPlsqlItem.FIRST) := EL_PL2SQL_0(aPlsqlItem(I));
>>       END LOOP;
>>     END IF;
>>     RETURN aSqlItem;
>>   END EL_PL2SQL_2;
>> BEGIN
>>   inputoutput_TARGET := EL_SQL2PL_3(inputoutput_COMPAT);
>>   XXZ_TEST_PKG.procedure_tab_index(input=>input_TARGET,
>> output=>output_TARGET, inputoutput=>inputoutput_TARGET);
>>   :3 := output_TARGET;
>>   :4 := EL_PL2SQL_2(inputoutput_TARGET);
>> END;
>>   bind => [:1 => 10, :2 =>
>> test.jp.co.benesse.y01.z0.dao.util.test.PLSQLHelperTestTableIndexDTO@18dd1d8,
>> output => :3, inputoutput => :4]
>> _______________________________________________
>> eclipselink-users mailing list
>> eclipselink-users@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>>
>>
>
>
> -----
> http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland
> http://www.eclipse.org/eclipselink/
>  EclipseLink ,  http://www.oracle.com/technology/products/ias/toplink/
> TopLink
> Wiki:  http://wiki.eclipse.org/EclipseLink EclipseLink ,
> http://wiki.oracle.com/page/TopLink TopLink
> Forums:  http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink ,
> http://www.nabble.com/EclipseLink-f26430.html EclipseLink
> Book:  http://en.wikibooks.org/wiki/Java_Persistence Java Persistence
> --
> View this message in context: http://old.nabble.com/How-to-call-some-procedures-which-has-an-associative-array-as-an-argument.-tp28147144p28166238.html
> Sent from the EclipseLink - Users mailing list archive at Nabble.com.
>
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>