/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.testing.tests.customsqlstoredprocedures; import java.sql.Types; import java.util.Vector; import org.eclipse.persistence.internal.databaseaccess.DatabaseCall; import org.eclipse.persistence.sessions.DatabaseRecord; import org.eclipse.persistence.testing.models.insurance.Address; import org.eclipse.persistence.queries.DataModifyQuery; import org.eclipse.persistence.queries.DataReadQuery; import org.eclipse.persistence.queries.DatabaseQuery; import org.eclipse.persistence.queries.SQLCall; import org.eclipse.persistence.queries.StoredProcedureCall; import org.eclipse.persistence.testing.framework.*; /* * StoredProcedureObjectRelationalParameters tests Toplinks ability to convert Java objects to/from DB Relational Objects * for use in stored procedures. This also tests passing in the argument type so that null objects can be passed to the * stored procedure. Setting useCustomSQL to true/false switches between using custom sql (SQLCall) and using * a StoredProcedureCall for the tests. */ public class StoredProcedureObjectRelationalParameters extends TestCase{ Object result = null; Vector results2, results3 = null; Address originalAddress; Long policyHolderIdToUse = new Long(12345); boolean useCustomSQL; public StoredProcedureObjectRelationalParameters() { this.useCustomSQL =false; } public StoredProcedureObjectRelationalParameters(boolean useCustomSQL) { this.useCustomSQL = useCustomSQL; setName(getName() + " useCustomSQL = " + useCustomSQL); } public void setup() { // right now only the stored procedure is set up in Oracle if (!(getSession().getPlatform().isOracle9())) { throw new TestWarningException("This test can only be run in Oracle9"); } try { getSession().executeNonSelectingSQL("Delete from PolicyHolders where (ssn = "+policyHolderIdToUse+" )"); }catch (Exception e){//ignore exceptions } originalAddress = new org.eclipse.persistence.testing.models.insurance.Address(); originalAddress.setCountry("Canada"); originalAddress.setCity("Ottawa"); originalAddress.setState("On"); originalAddress.setStreet("mystreet"); originalAddress.setZipCode("Zip"); } public void test() { Vector args = new Vector(); args.addElement(policyHolderIdToUse);//ssn args.addElement(null);//occupation args.addElement(new Character('M'));//sex args.addElement("Chris");//firstName args.addElement(null);//birthDate args.addElement("Random");//lastName args.addElement(originalAddress);//address args.addElement(null);//childrenNames args.addElement(null);//phones //testing that an exception is not thrown, using IN parameters exclusively result = getSession().executeQuery(getInsertQuery(), args); //using OUT parameters exclusively, verifying policyHolder was created Vector args2 = new Vector(); args2.addElement(policyHolderIdToUse);//ssn results2 = (Vector)getSession().executeQuery(getReadQuery(), args2); //using IN OUT parameters exclusively, deleting a policyholder results3 = (Vector)getSession().executeQuery(getDeleteQuery(), args); } public void verify() { if ((results2.size()!=1) &&(results3.size()!=1)){ throw new TestErrorException("Collections returned did not contain expected number of results"); } Address addressRead = ((Address)((DatabaseRecord)results2.get(0)).get("address")); if (!originalAddress.getStreet().equals(addressRead.getStreet())){ throw new TestErrorException("Address in did not equal the address returned out by SProc_Read_PHolders"); } Address addressRemoved = ((Address)((DatabaseRecord)results3.get(0)).get("address")); if (!originalAddress.getStreet().equals(addressRemoved.getStreet())){ throw new TestErrorException("Address in did not equal the address returned out by SProc_Delete_PHolders"); } } public DatabaseCall getInsertCall(){ DatabaseCall call = null; if (useCustomSQL){ String sqlString = "BEGIN SProc_Insert_PHolders(#ssn, #occupation, #sex, "+ "#firstName, #birthDate, #lastName, #address, #childrenNames, #phones); END;"; SQLCall sqlcall = new SQLCall(sqlString); //most are not needed unless null it to be passed in sqlcall.setCustomSQLArgumentType("ssn", Long.class); sqlcall.setCustomSQLArgumentType("occupation", String.class); sqlcall.setCustomSQLArgumentType("sex", Character.class); sqlcall.setCustomSQLArgumentType("firstName", String.class); sqlcall.setCustomSQLArgumentType("birthDate", java.sql.Date.class); sqlcall.setCustomSQLArgumentType("lastName", String.class); //address arg type isn't needed to convert Address to a Struct sqlcall.setCustomSQLArgumentType("address", Types.STRUCT, "ADDRESS_TYPE"); sqlcall.setCustomSQLArgumentType("childrenNames", Types.ARRAY, "NAMELIST_TYPE"); sqlcall.setCustomSQLArgumentType("phones", Types.ARRAY, "PHONELIST_TYPE"); call = sqlcall; }else { StoredProcedureCall spcall = new StoredProcedureCall(); spcall.setProcedureName("SProc_Insert_PHolders"); spcall.addUnamedArgument("ssn", Long.class); spcall.addUnamedArgument("occupation", String.class); spcall.addUnamedArgument("sex", Character.class); spcall.addUnamedArgument("firstName", String.class); spcall.addUnamedArgument("birthDate", java.sql.Date.class); spcall.addUnamedArgument("lastName", String.class); //address arg type isn't needed to convert Address to a Struct spcall.addUnamedArgument("address", Types.STRUCT, "ADDRESS_TYPE"); //test just passing in array objects (or nulls) spcall.addUnamedArgument("childrenNames", Types.ARRAY, "NAMELIST_TYPE"); spcall.addUnamedArgument("phones", Types.ARRAY, "PHONELIST_TYPE"); call = spcall; } return call; } public DatabaseQuery getInsertQuery(){ DataModifyQuery query = new DataModifyQuery(); query.setShouldBindAllParameters(true); query.bindAllParameters(); query.setCall(getInsertCall()); query.addArgument("ssn"); query.addArgument("occupation"); query.addArgument("sex"); query.addArgument("firstName"); query.addArgument("birthDate"); query.addArgument("lastName"); query.addArgument("address"); query.addArgument("childrenNames"); query.addArgument("phones"); return query; } public DatabaseCall getReadCall(){ DatabaseCall call = null; if (useCustomSQL){ String sqlString = "BEGIN SProc_Read_PHolders(####ssn, ###occupation, ###sex, "+ "###firstName, ###birthDate, ###lastName, ###address, ###childrenNames, ###phones); END;"; SQLCall sqlcall = new SQLCall(sqlString); sqlcall.setCustomSQLArgumentType("ssn", Long.class); sqlcall.setCustomSQLArgumentType("occupation", String.class); sqlcall.setCustomSQLArgumentType("sex", Character.class); sqlcall.setCustomSQLArgumentType("firstName", String.class); sqlcall.setCustomSQLArgumentType("birthDate", java.sql.Date.class); sqlcall.setCustomSQLArgumentType("lastName", String.class); sqlcall.setCustomSQLArgumentType("address", Types.STRUCT, "ADDRESS_TYPE", Address.class); sqlcall.setCustomSQLArgumentType("childrenNames", Types.ARRAY, "NAMELIST_TYPE"); sqlcall.setCustomSQLArgumentType("phones", Types.ARRAY, "PHONELIST_TYPE"); call = sqlcall; }else{ StoredProcedureCall spcall = new StoredProcedureCall(); spcall.setProcedureName("SProc_Read_PHolders"); spcall.addUnamedInOutputArgument("ssn", Long.class); spcall.addUnamedOutputArgument("occupation", String.class); spcall.addUnamedOutputArgument("sex", Character.class); spcall.addUnamedOutputArgument("firstName", String.class); spcall.addUnamedOutputArgument("birthDate", java.sql.Date.class); spcall.addUnamedOutputArgument("lastName", String.class); spcall.addUnamedOutputArgument("address", Types.STRUCT, "ADDRESS_TYPE", Address.class); spcall.addUnamedOutputArgument("childrenNames", Types.ARRAY, "NAMELIST_TYPE"); spcall.addUnamedOutputArgument("phones", Types.ARRAY, "PHONELIST_TYPE"); call = spcall; } return call; } public DatabaseQuery getReadQuery(){ DataReadQuery query = new DataReadQuery(); query.setShouldBindAllParameters(true); query.bindAllParameters(); query.setCall(getReadCall()); query.addArgument("ssn"); return query; } public DatabaseCall getDeleteCall(){ DatabaseCall call = null; if (useCustomSQL){ String sqlString = "BEGIN SProc_Delete_PHolders(####ssn, ####occupation, ####sex, "+ "####firstName, ####birthDate, ####lastName, ####address, ####childrenNames, ####phones); END;"; SQLCall sqlcall = new SQLCall(sqlString); sqlcall.setCustomSQLArgumentType("ssn", Long.class); sqlcall.setCustomSQLArgumentType("occupation", String.class); sqlcall.setCustomSQLArgumentType("sex", Character.class); sqlcall.setCustomSQLArgumentType("firstName", String.class); sqlcall.setCustomSQLArgumentType("birthDate", java.sql.Date.class); sqlcall.setCustomSQLArgumentType("lastName", String.class); sqlcall.setCustomSQLArgumentType("address", Types.STRUCT, "ADDRESS_TYPE", Address.class); sqlcall.setCustomSQLArgumentType("childrenNames", Types.ARRAY, "NAMELIST_TYPE"); sqlcall.setCustomSQLArgumentType("phones", Types.ARRAY, "PHONELIST_TYPE"); call = sqlcall; }else{ StoredProcedureCall sqlcall = new StoredProcedureCall(); sqlcall.setProcedureName("SProc_Delete_PHolders"); sqlcall.addUnamedInOutputArgument("ssn", Long.class); sqlcall.addUnamedInOutputArgument("occupation", String.class); sqlcall.addUnamedInOutputArgument("sex", Character.class); sqlcall.addUnamedInOutputArgument("firstName", String.class); sqlcall.addUnamedInOutputArgument("birthDate", java.sql.Date.class); sqlcall.addUnamedInOutputArgument("lastName", String.class); sqlcall.addUnamedInOutputArgument("address", "address", Types.STRUCT, "ADDRESS_TYPE", Address.class); sqlcall.addUnamedInOutputArgument("childrenNames", "childrenNames", Types.ARRAY, "NAMELIST_TYPE", Vector.class); sqlcall.addUnamedInOutputArgument("phones", "phones", Types.ARRAY, "PHONELIST_TYPE"); call = sqlcall; } return call; } public DatabaseQuery getDeleteQuery(){ DataReadQuery query3 = new DataReadQuery(); query3.setShouldBindAllParameters(true); query3.bindAllParameters(); query3.setCall(getDeleteCall()); query3.addArgument("ssn"); query3.addArgument("occupation"); query3.addArgument("sex"); query3.addArgument("firstName"); query3.addArgument("birthDate"); query3.addArgument("lastName"); query3.addArgument("address"); query3.addArgument("childrenNames"); query3.addArgument("phones"); return query3; } }