/******************************************************************************* | |
* Copyright (c) 1998, 2013 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.queries; | |
import org.eclipse.persistence.exceptions.ValidationException; | |
import org.eclipse.persistence.internal.databaseaccess.DatabasePlatform; | |
import org.eclipse.persistence.internal.helper.DatabaseField; | |
import org.eclipse.persistence.internal.sessions.AbstractSession; | |
import org.eclipse.persistence.mappings.structures.ObjectRelationalDatabaseField; | |
import static org.eclipse.persistence.internal.helper.Helper.getShortClassName; | |
/** | |
* <b>Purpose</b>: Used to define a platform independent function call. | |
* Note that not all platforms support stored functions. | |
* This supports output parameters. | |
* Functions can also be called through custom SQL. | |
*/ | |
public class StoredFunctionCall extends StoredProcedureCall { | |
public StoredFunctionCall() { | |
super(); | |
addUnamedOutputArgument(""); | |
} | |
public StoredFunctionCall(int sqlType, String sqlTypeName, Class javaType) { | |
super(); | |
addUnamedOutputArgument("", sqlType, sqlTypeName, javaType); | |
} | |
public StoredFunctionCall(int sqlType, String sqlTypeName, Class javaType, DatabaseField nestedType) { | |
super(); | |
addUnamedOutputArgument("", sqlType, sqlTypeName, javaType, nestedType); | |
} | |
public StoredFunctionCall(int sqlType, String sqlTypeName, String javaTypeClassName) { | |
this(sqlType, sqlTypeName, (Class)null); | |
ObjectRelationalDatabaseField ordf = (ObjectRelationalDatabaseField)parameters.get(0); | |
ordf.setTypeName(javaTypeClassName); | |
} | |
public StoredFunctionCall(int sqlType, String sqlTypeName, String javaTypeClassName, DatabaseField nestedType) { | |
this(sqlType, sqlTypeName, javaTypeClassName); | |
ObjectRelationalDatabaseField ordf = (ObjectRelationalDatabaseField)parameters.get(0); | |
ordf.setNestedTypeField(nestedType); | |
} | |
/** | |
* INTERNAL: | |
* Return call header for the call string. | |
*/ | |
public String getCallHeader(DatabasePlatform platform) { | |
return platform.getFunctionCallHeader(); | |
} | |
/** | |
* INTERNAL: | |
* Return the first index of parameter to be placed inside brackets | |
* in the call string. | |
*/ | |
public int getFirstParameterIndexForCallString() { | |
return 1; | |
} | |
/** | |
* INTERNAL: | |
*/ | |
public boolean isStoredFunctionCall() { | |
return true; | |
} | |
/** | |
* INTERNAL: | |
*/ | |
public void prepareInternal(AbstractSession session) { | |
if (session.getPlatform().supportsStoredFunctions()) { | |
super.prepareInternal(session); | |
} else { | |
throw ValidationException.platformDoesNotSupportStoredFunctions(getShortClassName(session.getPlatform())); | |
} | |
} | |
/** | |
* PUBLIC: | |
* Define the field name to be substitute for the function return. | |
*/ | |
public void setResult(String name) { | |
DatabaseField returnField = (DatabaseField)getParameters().get(0); | |
returnField.setName(name); | |
} | |
/** | |
* PUBLIC: | |
* Define the field name to be substitute for the function return. | |
* The type is the type of Java class desired back from the function, this is dependent on the type returned from the function. | |
*/ | |
public void setResult(String name, Class type) { | |
DatabaseField returnField = (DatabaseField)getParameters().get(0); | |
returnField.setName(name); | |
returnField.setType(type); | |
} | |
/** | |
* PUBLIC: | |
* Define the field name to be substitute for the function return. | |
* The type is the type of Java class desired back from the function, this is dependent on the type returned from the function. | |
*/ | |
public void setResult(String name, int type, String typeName) { | |
ObjectRelationalDatabaseField field = new ObjectRelationalDatabaseField(name); | |
field.setSqlType(type); | |
field.setSqlTypeName(typeName); | |
getParameters().set(0, field); | |
} | |
/** | |
* PUBLIC: | |
* Define the ObjectRelationalDatabaseField to be substituted for the function return. | |
* The type is the JDBC type code, this is dependent on the type required by the procedure. | |
* The typeName is the JDBC type name, this may be required for ARRAY or STRUCT types. | |
* The javaType is the mapped Class that has an ObjectRelationalDataTypeDescriptor for the ARRAY | |
* or STRUCT type typeName | |
*/ | |
public void setResult(int type, String typeName, Class javaType) { | |
ObjectRelationalDatabaseField field = new ObjectRelationalDatabaseField(""); | |
field.setSqlType(type); | |
field.setSqlTypeName(typeName); | |
field.setType(javaType); | |
getParameters().set(0, field); | |
} | |
/** | |
* PUBLIC: | |
* Define the ObjectRelationalDatabaseField to be substituted for the function return. This | |
* will typically be called for ARRAY types. | |
* The type is the JDBC type code, this is dependent on the type required by the procedure. | |
* The typeName is the JDBC type name, this may be required for ARRAY types. | |
* The javaType is the mapped Class that has an ObjectRelationalDataTypeDescriptor for the ARRAY | |
* type typeName | |
* The nestedType is a database field representing the type the ARRAY holds onto. | |
*/ | |
public void setResult(int type, String typeName, Class javaType, DatabaseField nestedType) { | |
ObjectRelationalDatabaseField field = new ObjectRelationalDatabaseField(""); | |
field.setSqlType(type); | |
field.setSqlTypeName(typeName); | |
field.setType(javaType); | |
field.setNestedTypeField(nestedType); | |
getParameters().set(0, field); | |
} | |
/** | |
* PUBLIC: | |
* Define the field name to be substitute for the function return. | |
* The type is the type of Java class desired back from the function, this is dependent on the type returned from the function. | |
*/ | |
public void setResult(String name, int type) { | |
DatabaseField returnField = (DatabaseField)getParameters().get(0); | |
returnField.setName(name); | |
returnField.setSqlType(type); | |
} | |
/** | |
* PUBLIC: | |
* Define to return cursor as result. | |
*/ | |
public void setResultCursor() { | |
getParameterTypes().set(0, OUT_CURSOR); | |
setIsCursorOutputProcedure(!hasOutputCursors()); | |
setIsMultipleCursorOutputProcedure(hasOutputCursors()); | |
} | |
} |