Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] Error while calling a PLSQL stored procedure having a PLSQLTable type as one of its IN parameter.

The struct type finally worked for me in eclipse link. Thanks to James and
Christopher.

This is the code that I used:


 ObjectRelationalDataTypeDescriptor descriptor = new
ObjectRelationalDataTypeDescriptor();

	        descriptor.setJavaClass(MyType.class); 
	        descriptor.descriptorIsAggregate();
	        descriptor.setStructureName("LR_QUERY_TYPE");
	        descriptor.setTableName("LR_QUERY_TABLE");   
	        descriptor.addDirectMapping("queryType", "getQueryType",
"setQueryType", "queryType".toUpperCase());
	        descriptor.addDirectMapping("queryString", "getQueryString",
"setQueryString", "queryString".toUpperCase());
	        descriptor.setShouldOrderMappings(false);
	     
	        sess.addDescriptor(descriptor);
	        	
	
plsqlcall.addNamedArgument("wbdatareqd","wbdatareqd",JDBCTypes.ARRAY_TYPE.getSqlCode(),"LR_QUERY_TABLE");


List parameters=plsqlcall.getParameters();
		
		for(int i=0; i<parameters.size(); i++)
		{
			DatabaseField param=	(DatabaseField)parameters.get(i);
		System.out.println(param.getClass().getName());
		if("wbdatareqd".equals(param.getName()))
		{
			ObjectRelationalDatabaseField ordf = new
ObjectRelationalDatabaseField("");
		       ordf.setSqlType(Types.STRUCT);
		       ordf.setSqlTypeName("LR_QUERY_TYPE");
		       ordf.setType(MyType.class); 
		       
		     
((ObjectRelationalDatabaseField)(parameters.get(i))).setSqlType(Types.ARRAY);
		     
((ObjectRelationalDatabaseField)(parameters.get(i))).setSqlTypeName("LR_QUERY_TABLE");
		     
((ObjectRelationalDatabaseField)(parameters.get(i))).setType(ArrayList.class);
		     
((ObjectRelationalDatabaseField)(parameters.get(i))).setNestedTypeField(ordf);       
		}
		}

Regards
Saikat.


SaikatSen wrote:
> 
> These are the types which I have:
> 
> TYPE LR_QUERY_TABLE AS TABLE OF LR_QUERY_TYPE;
> 
> TYPE LR_QUERY_TYPE AS OBJECT(queryType VARCHAR2(64),queryString
> varchar2(16000));
> 
> This is my stored procedure:
> 
> create or replace
> PROCEDURE MY_TEST_PROCEDURE
> (wbdatareqd IN lr_query_table,
>  pqr IN VARCHAR2,
> result OUT VARCHAR2)
> AS abc VARCHAR2(4000);
> BEGIN
>  SELECT lrqt.queryString INTO abc  FROM TABLE(wbdatareqd) lrqt WHERE
> lrqt.queryType = 'Itinerary';
> result :=abc;
> 
> EXCEPTION
> WHEN OTHERS THEN
> result := 'error***' || sqlerrm;
> end  MY_TEST_PROCEDURE;
> 
> These are the classes which I have:
> 
> @Embeddable
> @Struct(name="LR_QUERY_TYPE", fields={"queryType","queryString"})
> public class MyType extends ComplexDatabaseType {
> 
> 	@Column(name="queryType")
> 	private String queryType;
> 	
> 	@Column(name="queryString")
> 	private String queryString;
> 
> 	public String getQueryType() {
> 		return queryType;
> 	}
> 
> 	public void setQueryType(String queryType) {
> 		this.queryType = queryType;
> 	}
> 
> 	public String getQueryStr() {
> 		return queryString;
> 	}
> 
> 	public void setQueryStr(String queryStr) {
> 		this.queryString = queryStr;
> 	}
> 
> 
> 
> @PLSQLTable(compatibleType="LR_QUERY_TABLE",name="LR_QUERY_TABLE",nestedType="LR_QUERY_TYPE",javaType=MyTableTyp.class)
> public class MyTableTyp extends ArrayList {
> 
> 	/**
> 	 * 
> 	 */
> 	private static final long serialVersionUID = 1L;
> }
> 
> This is the code I am trying to run:
> 	 
> 		PLSQLStoredProcedureCall plsqlcall = new PLSQLStoredProcedureCall();
> 		plsqlcall.setProcedureName("MY_TEST_PROCEDURE");
> 		
> 		MyType myType=new MyType();
> 		myType.setCompatibleType("LR_QUERY_TYPE");
> 		myType.setJavaType(MyType.class);
> 		myType.setTypeName("LR_QUERY_TYPE");
> 		
> 		PLSQLCollection plSqlCollection=new PLSQLCollection();
> 		plSqlCollection.setCompatibleType("LR_QUERY_TABLE");
> 		plSqlCollection.setJavaType(MyTableTyp.class);
> 		plSqlCollection.setNestedType(myType);
> 		plSqlCollection.setTypeName("LR_QUERY_TABLE");
> 		
> 		plsqlcall.addNamedArgument("wbdatareqd",plSqlCollection);
> 		plsqlcall.addNamedArgument("pqr",JDBCTypes.VARCHAR_TYPE);
> 		plsqlcall.addNamedOutputArgument("result",JDBCTypes.VARCHAR_TYPE);	
> 		
> 		DataReadQuery  readQuery=new DataReadQuery();
> 		readQuery.addArgument("wbdatareqd",MyTableTyp.class);
> 		readQuery.addArgument("pqr",String.class);
>         readQuery.setCall(plsqlcall);
>         readQuery.bindAllParameters();
>         
>         Vector args=new Vector();
>       
>         MyTableTyp myTableType=new MyTableTyp(); 
>         myType.setQueryStr("ITN_TYP_CD FROM ITN WHERE ITN_ID=22");
>         myType.setQueryType("Itinerary");
>         myTableType.add(myType);
>         args.add(myTableType);
>         args.add("test");
>        
>        Object result=
> jpaEntityManager.getActiveSession().executeQuery(readQuery,args);
> 
> 
> 
> This is the error that I get :
> 
> Caused by: java.sql.SQLException: Fail to convert to internal
> representation: MyType(LR_QUERY_TYPE)
> 	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
> 	at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
> 	at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:1130)
> 	at oracle.jdbc.oracore.OracleTypeADT.toDatum(OracleTypeADT.java:259)
> 	at oracle.jdbc.oracore.OracleTypeADT.toDatumArray(OracleTypeADT.java:303)
> 	at oracle.jdbc.oracore.OracleTypeUPT.toDatumArray(OracleTypeUPT.java:117)
> 	at oracle.sql.ArrayDescriptor.toOracleArray(ArrayDescriptor.java:1517)
> 	at oracle.sql.ARRAY.<init>(ARRAY.java:133)
> 	at
> org.eclipse.persistence.platform.database.oracle.Oracle8Platform.createArray(Oracle8Platform.java:267)
> 	at
> org.eclipse.persistence.internal.databaseaccess.DatabasePlatform.createArray(DatabasePlatform.java:2923)
> 	at
> org.eclipse.persistence.internal.databaseaccess.BindCallCustomParameter.convert(BindCallCustomParameter.java:142)
> 	at
> org.eclipse.persistence.internal.databaseaccess.InParameterForCallableStatement.set(InParameterForCallableStatement.java:30)
> 	at
> org.eclipse.persistence.internal.databaseaccess.DatabasePlatform.setParameterValueInDatabaseCall(DatabasePlatform.java:2229)
> 	at
> org.eclipse.persistence.platform.database.oracle.Oracle9Platform.setParameterValueInDatabaseCall(Oracle9Platform.java:476)
> 	at
> org.eclipse.persistence.internal.databaseaccess.DatabaseCall.prepareStatement(DatabaseCall.java:716)
> 	at
> org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:585)
> 	... 18 more.
> 
> 
> Any idea what changes  I need to do in the code to make this working. I
> have been working on this for the past 2 days without any result. Thanks
> for any help in advance
> 
> Saikat.
> 
> 

-- 
View this message in context: http://old.nabble.com/Error-while-calling-a-PLSQL-stored-procedure-having-a-PLSQLTable-type-as-one-of-its-IN-parameter.-tp33149957p33190521.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top