Need support for Dynamic procedure invocation

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Need support for Dynamic procedure invocation

Nicky Jha

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#,#byteVal1#).

Now I want to call this procedure from Ibatis SQL mapping XML like this

 

<procedure id="executeCopyProcs"  parameterClass="com.jpmorgan.pyramid.pyrsyst.configure.ProcParameterMapper">

{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#,#byteVal1) 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.

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Need support for Dynamic procedure invocation

Jeff Butler-2
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 <[hidden email]> 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#,#byteVal1#).
>
> Now I want to call this procedure from Ibatis SQL mapping XML like this
>
>
>
> <procedure id="executeCopyProcs"
> parameterClass="com.jpmorgan.pyramid.pyrsyst.configure.ProcParameterMapper">
>
> {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#,#byteVal1)
> 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.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

RE: Need support for Dynamic procedure invocation

Nicky Jha
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:[hidden email]]
Sent: Friday, May 14, 2010 4:53 PM
To: [hidden email]
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 <[hidden email]> 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#,#byteVal1#).
>
> Now I want to call this procedure from Ibatis SQL mapping XML like this
>
>
>
> <procedure id="executeCopyProcs"
> parameterClass="com.jpmorgan.pyramid.pyrsyst.configure.ProcParameterMapper">
>
> {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#,#byteVal1)
> 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: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

RE: Need support for Dynamic procedure invocation

Joe Gooch
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:[hidden email]]
> Sent: Friday, May 14, 2010 7:38 AM
> To: [hidden email]
> 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:[hidden email]]
> Sent: Friday, May 14, 2010 4:53 PM
> To: [hidden email]
> 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 <[hidden email]>
> 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: [hidden email]
> For additional commands, e-mail: [hidden email]


---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Need support for Dynamic procedure invocation

Jeff Butler-2
Yes - this the best approach.

Jeff Butler


On 5/14/10, Joe Gooch <[hidden email]> wrote:

> 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:[hidden email]]
>> Sent: Friday, May 14, 2010 7:38 AM
>> To: [hidden email]
>> 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:[hidden email]]
>> Sent: Friday, May 14, 2010 4:53 PM
>> To: [hidden email]
>> 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 <[hidden email]>
>> 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: [hidden email]
>> For additional commands, e-mail: [hidden email]
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>

--
Sent from my mobile device

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

RE: Need support for Dynamic procedure invocation

Nicky Jha
Joe/Jeff

This worked with your suggestion.Thank you so much!!!

Nicky

-----Original Message-----
From: Jeff Butler [mailto:[hidden email]]
Sent: Friday, May 14, 2010 6:31 PM
To: [hidden email]
Subject: Re: Need support for Dynamic procedure invocation

Yes - this the best approach.

Jeff Butler


On 5/14/10, Joe Gooch <[hidden email]> wrote:

> 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:[hidden email]]
>> Sent: Friday, May 14, 2010 7:38 AM
>> To: [hidden email]
>> 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:[hidden email]]
>> Sent: Friday, May 14, 2010 4:53 PM
>> To: [hidden email]
>> 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 <[hidden email]>
>> 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: [hidden email]
>> For additional commands, e-mail: [hidden email]
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [hidden email]
> For additional commands, e-mail: [hidden email]
>
>

--
Sent from my mobile device

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]


---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]

Loading...