I suggest going with a dynamic SQL approach in the mapped statement.
public class DynamicProcedureParams {
private String procedureName;
private List<Object> params = new ArrayList<Object>();
// getters and setters here
}
<procedure id="executeCopyProcs"
parameterClass="path.to.DynamicProcedureParams">
{call $procedureName$ <iterate property="params" open="(" close=")"
conjunction=",">#params[]#</iterate> }
</procedure>
Joe
Confidentiality Notice:
This e-mail transmission may contain confidential and legally privileged
information that is intended only for the individual named in the e-mail
address. If you are not the intended recipient, you are hereby notified that
any disclosure, copying, distribution, or reliance upon the contents of this
e-mail message is strictly prohibited. If you have received this e-mail
transmission in error, please reply to the sender, so that proper delivery can
be arranged, and please delete the message from your mail box.
> -----Original Message-----
> From: Nicky Jha [mailto:[email protected]]
> Sent: Friday, May 14, 2010 7:38 AM
> To: [email protected]
> Subject: RE: Need support for Dynamic procedure invocation
>
> Hi Jeff,
>
> Thanks for this, if I was to do as suggested and compose the entire
> string with parameter values, how will the parameter types (e.g. date,
> smallint etc) be handled?
>
> Nicky!
>
> -----Original Message-----
> From: Jeff Butler [mailto:[email protected]]
> Sent: Friday, May 14, 2010 4:53 PM
> To: [email protected]
> Subject: Re: Need support for Dynamic procedure invocation
>
> This won't work (as you've discovered). iBATIS 2.x does not reparse
> the string for variables after string substitution. You'll need to do
> this with the dynamic tags, or you'll need to compose the entire
> string (including parameter values - like {call myproc('fred')}).
>
> Jeff Butler
>
>
> On Fri, May 14, 2010 at 4:12 AM, Nicky Jha <[email protected]>
> wrote:
> > Hi Team,
> >
> >
> >
> > I am having hard time resolving following issue.Please help.
> >
> > We are using Ibatis 2.X.
> >
> > In our application we want capability to invoke stored procedure by
> reading
> > it from property xml file.We provide procedure name parameters,
> parameters
> > type to property xml file.
> >
> > Now from this xml file I have created one dynamic procedure string
> like
> >
> procedureName(#stringVal1#,#stringVal2#,#stringVal3#,#intVal1#,#byteVal
> 1#).
> >
> > Now I want to call this procedure from Ibatis SQL mapping XML like
> this
> >
> >
> >
> > <procedure id="executeCopyProcs"
> >
> parameterClass="com.jpmorgan.pyramid.pyrsyst.configure.ProcParameterMap
> per">
> >
> > {call $procedureName$ }
> >
> >
> >
> > </procedure>
> >
> >
> >
> > Please refer below for ProcParameterMapper class. Now as soon as
> iBatis sees
> > $procedureName$, it replaces it with say
> > (#stringVal1#,#stringVal2#,#stringVal3#,#intVal1#,#byteVal1#) but it
> does
> > not replace the placeHolder(#), it passes on this as it is.Which is a
> issue.
> >
> >
> >
> > If we type
> >
> procedureName(#stringVal1#,#stringVal2#,#stringVal3#,#intVal1#,#byteVal
> 1)
> > directly into SQL mapping XML, it replaces place holder, but with
> string
> > substitution , it does not work.We can't type directly into mapping
> xML, as
> > this string is composed at run time.Also dynamic tags are not of
> help, as
> > logic to create
> > (#stringVal1#,#stringVal2#,#stringVal3#,#intVal1#,#byteVal1#) complex
> > procedure with different types of parameter can't be written in
> mapping
> > XML.At least I am unable to do.
> >
> >
> >
> > I am really struck.Please suggest us the best way to deal with it.
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > package com.jpmorgan.pyramid.pyrsyst.configure;
> >
> >
> >
> > import java.lang.reflect.Field;
> >
> >
> >
> > public class ProcParameterMapper {
> >
> >
> >
> > StringBuffer procedureName = new StringBuffer("");
> >
> > boolean firstParam = true;
> >
> > boolean lastParam = false;
> >
> >
> >
> > String stringVal1;
> >
> > String stringVal2;
> >
> > String stringVal3;
> >
> > String stringVal4;
> >
> > String stringVal5;
> >
> > String stringVal6;
> >
> > String stringVal7;
> >
> > String stringVal8;
> >
> > String stringVal9;
> >
> > String stringVal10;
> >
> >
> >
> > int intVal1;
> >
> > int intVal2;
> >
> > int intVal3;
> >
> > int intVal4;
> >
> > int intVal5;
> >
> > int intVal6;
> >
> > int intVal7;
> >
> > int intVal8;
> >
> > int intVal9;
> >
> > int intVal10;
> >
> >
> >
> > byte byteVal1;
> >
> > byte byteVal2;
> >
> > byte byteVal3;
> >
> > byte byteVal4;
> >
> > byte byteVal5;
> >
> >
> >
> > public void setStringVal(String value, int count,String
> jdbcType)
> > throws ConfigureException {
> >
> >
> >
> > Field[] field =
> ProcParameterMapper.class.getDeclaredFields();
> >
> >
> >
> > for (int i = 0; i < field.length; i++) {
> >
> > try {
> >
> > if
> > (field[i].getName().endsWith(String.valueOf(count))
> >
> > && ("String")
> >
> >
> > .equals(field[i].getType().getSimpleName())) {
> >
> > field[i].set(this, value);
> >
> > if (firstParam) {
> >
> > procedureName.append("(#" +
> > field[i].getName()+"#");
> >
> > firstParam = false;
> >
> > } else if (lastParam) {
> >
> > procedureName.append(",#" +
> > field[i].getName() +"#)");
> >
> > } else {
> >
> > procedureName.append(",#" +
> > field[i].getName()+"#");
> >
> > }
> >
> > break;
> >
> >
> >
> > }
> >
> > } catch (Exception e) {
> >
> > throw new ConfigureException(
> >
> > "Exception setting String value
> in
> > paramMapper"
> >
> > + e.getStackTrace());
> >
> > }
> >
> >
> >
> > }
> >
> >
> >
> > }
> >
> >
> >
> > public void setIntVal(int value, int count,String jdbcType)
> throws
> > ConfigureException {
> >
> >
> >
> > Field[] field =
> ProcParameterMapper.class.getDeclaredFields();
> >
> >
> >
> > for (int i = 0; i < field.length; i++) {
> >
> > try {
> >
> > if
> > (field[i].getName().endsWith(String.valueOf(count))
> >
> > &&
> > ("int").equals(field[i].getType().getSimpleName())) {
> >
> >
> >
> > field[i].set(this, value);
> >
> > if (firstParam) {
> >
> > procedureName.append("(#" +
> > field[i].getName()+"#");
> >
> > firstParam = false;
> >
> > } else if (lastParam) {
> >
> > procedureName.append(",#" +
> > field[i].getName() +"#)");
> >
> > } else {
> >
> > procedureName.append(",#" +
> > field[i].getName()+"#");
> >
> > }
> >
> > break;
> >
> > }
> >
> > } catch (Exception e) {
> >
> > throw new ConfigureException(
> >
> > "Exception setting int value in
> > paramMapper"
> >
> > + e.getStackTrace());
> >
> > }
> >
> >
> >
> > }
> >
> >
> >
> > }
> >
> >
> >
> > public void setByteVal(Byte value, int count,String jdbcType)
> throws
> > ConfigureException {
> >
> >
> >
> > Field[] field =
> ProcParameterMapper.class.getDeclaredFields();
> >
> >
> >
> > for (int i = 0; i < field.length; i++) {
> >
> > try {
> >
> > if
> > (field[i].getName().endsWith(String.valueOf(count))
> >
> > &&
> > ("byte").equals(field[i].getType().getSimpleName())) {
> >
> >
> >
> > field[i].set(this, value);
> >
> > if (firstParam) {
> >
> > procedureName.append("(#" +
> > field[i].getName()+"#");
> >
> > firstParam = false;
> >
> > } else if (lastParam) {
> >
> > procedureName.append(",#" +
> > field[i].getName() + "#)");
> >
> > } else {
> >
> > procedureName.append(",#" +
> > field[i].getName()+"#");
> >
> > }
> >
> > break;
> >
> > }
> >
> > } catch (Exception e) {
> >
> > throw new ConfigureException(
> >
> > "Exception setting byte value in
> > paramMapper"
> >
> > + e.getStackTrace());
> >
> > }
> >
> >
> >
> > }
> >
> >
> >
> > }
> >
> >
> >
> > public String toString() {
> >
> >
> >
> > return new String("stringVal1 is" + stringVal1 +
> "stringVal2 is"
> >
> > + stringVal2 + "stringVal3 is" + stringVal3 +
> > "intVal1 is"
> >
> > + intVal1 + "intVal2 is" + intVal2 + "intVal3
> is" +
> > intVal3);
> >
> >
> >
> > }
> >
> >
> >
> > public void setProcedure(String procName) {
> >
> > procedureName.append(procName);
> >
> >
> >
> > }
> >
> >
> >
> > public String getProcedure(){
> >
> > return procedureName.toString();
> >
> > }
> >
> >
> >
> > }
> >
> >
> >
> > May thanks in advance
> >
> > Waiting for reply
> >
> > Nicky Jha
> >
> >
> >
> > This communication is for informational purposes only. It is not
> intended as
> > an offer or solicitation for the purchase or sale of any financial
> > instrument or as an official confirmation of any transaction. All
> market
> > prices, data and other information are not warranted as to
> completeness or
> > accuracy and are subject to change without notice. Any comments or
> > statements made herein do not necessarily reflect those of JPMorgan
> Chase &
> > Co., its subsidiaries and affiliates. This transmission may contain
> > information that is privileged, confidential, legally privileged,
> and/or
> > exempt from disclosure under applicable law. If you are not the
> intended
> > recipient, you are hereby notified that any disclosure, copying,
> > distribution, or use of the information contained herein (including
> any
> > reliance thereon) is STRICTLY PROHIBITED. Although this transmission
> and any
> > attachments are believed to be free of any virus or other defect that
> might
> > affect any computer system into which it is received and opened, it
> is the
> > responsibility of the recipient to ensure that it is virus free and
> no
> > responsibility is accepted by JPMorgan Chase & Co., its subsidiaries
> and
> > affiliates, as applicable, for any loss or damage arising in any way
> from
> > its use. If you received this transmission in error, please
> immediately
> > contact the sender and destroy the material in its entirety, whether
> in
> > electronic or hard copy format. Thank you. Please refer to
> > http://www.jpmorgan.com/pages/disclosures for disclosures relating to
> > European legal entities.
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]