Procedimiento almacenado Oracle e Ibatis

1,327 views
Skip to first unread message

jug

unread,
May 27, 2009, 8:59:16 AM5/27/09
to jug.cl
Bueno, como siempre recurro a Uds., ya que tengo el siguiente
problema, tengo un procedimiento en Oracle, el cual luego de insertar
y hacer otras operaciones devuelve un valor, hasta aqui todo
bien.....pero no se como recuperar ese valor en mi codigo java, el
cual llama el procedimiento desde Ibatis, esta llamada funciona si no
recupero el valor. Aqui les dejo el codigo por si alguien me puede
ayudar, desde ya gracias.

.
.
.
<parameterMap id="insertaMapTramo" class="java.util.Map">
<parameter property="nomv" mode="IN"
javaType="java.lang.Integer"/>
<parameter property="domv" mode="IN"
javaType="java.lang.String"/>
<parameter property="fecha" mode="IN" javaType="java.sql.Date"/
>
<parameter property="desde" mode="IN"
javaType="java.lang.String"/>
<parameter property="hacia" mode="IN"
javaType="java.lang.String"/>
<parameter property="idHac" mode="IN"
javaType="java.lang.Integer"/>
<parameter property="idDes" mode="IN"
javaType="java.lang.Integer"/>
<parameter property="etd" mode="IN"
javaType="java.lang.String"/>
<parameter property="eta" mode="IN"
javaType="java.lang.String"/>
<parameter property="paxs" mode="IN"
javaType="java.lang.Integer"/>
<parameter property="carga" mode="IN"
javaType="java.lang.Integer"/>
<parameter property="mater" mode="IN"
javaType="java.lang.String"/>
</parameterMap>

<procedure id="insertaTramo" parameterMap="insertaMapTramo">
{call insertaTramo(?,?,?,?,?,?,?,?,?,?,?,?)} ## Aqui es
donde no se como recuperar ???
</procedure>

German Gonzalez

unread,
May 27, 2009, 11:42:04 AM5/27/09
to ju...@googlegroups.com
Varios ejemplos para usar iBATIS con Oracle puedes encontrar aca:
http://www.it-eye.nl/weblog/2008/07/04/simple-delete-and-insert-statements-with-ibatis/

Atte.

German Gonzalez


``Antes de imprimir este e-mail piense bien si es realmente necesario''
``Before printing think about the Environment''



2009/5/27 jug <marcelo...@gmail.com>:

Jose Coronel

unread,
May 27, 2009, 12:23:58 PM5/27/09
to ju...@googlegroups.com
Hola

Una opción es que alguno de los parámetros de tu Map "insertaMapTramo" sea de tipo OUT o INOUT.

La otra opción es que declares el parámetro de retorno en la misma llamada del SP (pensando que lo que se retorna es un numero entero).

<procedure id="insertaTramo" parameterClass="java.util.HashMap">
        {#nombreParametro,mode=OUT,jdbcType=INTEGER# = call insertaTramo(?,?,?,?,?,?,?,?,?,?,?,?)}
</procedure>


Tu código java seria algo así:


public Integer ejemploSP() {
  HashMap parametros = new HashMap();
  ....
  parametros.put("nombreParametro", new Integer(-1));
  try {
     getInstance().update("insertaTramo", hm);
  } 
  catch (SQLException e) {
     e.printStackTrace();
  }
  return (Integer) parametros.get("nombreParametro");
}


Saludos


José Coronel


jug

unread,
Jun 2, 2009, 3:28:36 PM6/2/09
to jug.cl
Porfavor ayuda aun no logro solucionar esto....

miguel angel perez muñoz

unread,
Jun 3, 2009, 2:15:22 AM6/3/09
to ju...@googlegroups.com
Yo lo hago de la siguiente forma:

En ibatis tengo lo siguiente (el procedimiento almacenado recibe un sólo parámetro y devuelve un valor):

<parameterMap id="getFecha-params" class="java.util.Map" >
        <parameter property="Fecha" mode="INOUT" jdbcType="DATE" javaType="java.util.Date"/>
        <parameter property="I" mode="IN" jdbcType="NUMBER" javaType="java.lang.Integer" />
 </parameterMap>

 <procedure id="getFecha" parameterMap="getFecha-params">
      <![CDATA[
           {?= call ESQUEMA.ENTERO_A_FECHA(?)}
       ]]>
 </procedure>

En el código java:

 HashMap paramMap = new HashMap();
 paramMap.put("I", intFecha);
 this.getSqlMapClientTemplate().update("getFecha", paramMap);
 Date result = (Date) paramMap.get("Fecha");

Fijate en que se utiliza "update" para la llamada al procedimiento almacenado aunque en mi caso no hago no un update.

Espero que te sea de ayuda.

chao.

Jose Coronel

unread,
Jun 3, 2009, 9:52:28 AM6/3/09
to ju...@googlegroups.com
Marcelo

Disculpa que no te contestara antes...pero estoy tapado de pega.

Por la información que me enviaste, supongo que lo que quieres obtener son el código de error y el mensaje. Si es así, en tu XML debes definir:

<parameter property="err_num" mode="OUT" javaType="java.lang.Integer"/>
<parameter property="err_msg" mode="OUT" javaType="java.lang.String"/>

Como son de tipo OUT debes agregarlos a los parámetros de tu SP:

CREATE OR REPLACE PROCEDURE insertaTramo (idtr in integer,
         nomv in integer,
         domv in Varchar2,
         fecha in date,
         idHac in integer,
         idDes in integer,
         etdx in Varchar2,
         etax in Varchar2,
         paxs in integer,
         carga in integer,
         mater in varchar2,
         err_num in integer,
         err_msg in Varchar2) as temp integer;


Por ultimo, en tu código Java la llamada y acceso a los parámetros debe ser:

m.put("err_num", new Integer());
m.put("err_msg", new String());
sqlMap.queryForObject("OmvinsertaTramo", m);
m.get("err_num");



Saludos


José Coronel

jug

unread,
Jun 3, 2009, 2:25:21 PM6/3/09
to jug.cl
Gracias, por la ayuda pero.......


--- The error occurred in cl/fach/sicove/xml/Omv.xml.
--- The error occurred while executing update procedure.
--- Check the {call insertaTramo(?,?,?,?,?,?,?,?,?,?)}.
--- Check the output parameters (register output parameters failed).
--- Cause: java.sql.SQLException: Índice de columna no válido

haber, y lo que hize fue :

m.put("error", new Integer(0));
try {
sqlMap.insert("OmvinsertaTramo", m);
int x=(Integer)m.get("error");
System.out.println("x
--------------------------------------------- : "+x);
} catch (Exception e) {
log.error(e.getMessage());
}

en el xml puse, lo sgte.

<parameter property="error" mode="OUT" javaType="java.lang.Integer"/>

y en el procedimiento defini lo sgte.:

...,error in int) as ...

pero asi me daba error que no podia asignarle un valor, y lo deje como
error out int y se compilo pero igual manda lo errores...





On 3 jun, 09:52, Jose Coronel <jcoronelcor...@gmail.com> wrote:
> Marcelo
> Disculpa que no te contestara antes...pero estoy tapado de pega.
>
> Por la información que me enviaste, supongo que lo que quieres obtener son
> el código de error y el mensaje. Si es así, en tu XML debes definir:
>
> *<parameter property="err_num" mode="OUT" javaType="java.lang.Integer"/>*
> *<parameter property="err_msg" mode="OUT" javaType="java.lang.String"/>*
>
> Como son de tipo OUT debes agregarlos a los parámetros de tu SP:
>
> CREATE OR REPLACE PROCEDURE insertaTramo (idtr in integer,
>          nomv in integer,
>          domv in Varchar2,
>          fecha in date,
>          idHac in integer,
>          idDes in integer,
>          etdx in Varchar2,
>          etax in Varchar2,
>          paxs in integer,
>          carga in integer,
>          mater in varchar2,
>          *err_num in integer,*
> *         err_msg in Varchar2*) as temp integer;
>
> Por ultimo, en tu código Java la llamada y acceso a los parámetros debe ser:
>
> *m.put("err_num", new Integer());*
> *m.put("err_msg", new String());*
> *sqlMap.queryForObject("OmvinsertaTramo", m);*
> *m.get("err_num");*
>
> Saludos
>
> José Coronel
>
> El 3 de junio de 2009 2:15, miguel angel perez muñoz
> <mike...@gmail.com>escribió:
>
> > Yo lo hago de la siguiente forma:
>
> > En ibatis tengo lo siguiente (el procedimiento almacenado recibe un sólo
> > parámetro y devuelve un valor):
>
> > <parameterMap id="getFecha-params" class="java.util.Map" >
> >         <parameter property="Fecha" mode="INOUT" jdbcType="DATE"
> > javaType="java.util.Date"/>
> >         <parameter property="I" mode="IN" jdbcType="NUMBER"
> > javaType="java.lang.Integer" />
> >  </parameterMap>
>
> >  <procedure id="getFecha" parameterMap="getFecha-params">
> >       <![CDATA[
> >            {?= call ESQUEMA.ENTERO_A_FECHA(?)}
> >        ]]>
> >  </procedure>
>
> > En el código java:
>
> >  HashMap paramMap = new HashMap();
> >  paramMap.put("I", intFecha);
> >  this.getSqlMapClientTemplate().update("getFecha", paramMap);
> >  Date result = (Date) paramMap.get("Fecha");
>
> > Fijate en que se utiliza "update" para la llamada al procedimiento
> > almacenado aunque en mi caso no hago no un update.
>
> > Espero que te sea de ayuda.
>
> > chao.
>

jug

unread,
Jun 3, 2009, 2:31:58 PM6/3/09
to jug.cl
ah y se olvida asi es como lo llamo

<procedure id="OmvinsertaTramo" parameterMap="insertaMapTramo">
{call insertaTramo(?,?,?,?,?,?,?,?,?,?)}
</procedure>

jug

unread,
Jun 3, 2009, 2:33:02 PM6/3/09
to jug.cl
ah y se olvida asi es como lo llamo

<procedure id="OmvinsertaTramo" parameterMap="insertaMapTramo">
{call insertaTramo(?,?,?,?,?,?,?,?,?,?)}
</procedure>

On 3 jun, 14:25, jug <marcelo.uga...@gmail.com> wrote:

jug

unread,
Jun 4, 2009, 1:05:35 PM6/4/09
to jug.cl
Por favor AYUDAAAA!!!!!!!!!!!!!!!!!!, aun no doy con esto....

jcorone...@gmail.com

unread,
Jun 4, 2009, 1:15:09 PM6/4/09
to ju...@googlegroups.com
Marcelo

En vez de llamar al SP con un sqlMap.insert(...), llamalo con un sqlMap.queryForObject(....).

Saludos

Jose Coronel
Sent from my BlackBerry® wireless device

-----Original Message-----
From: jug <marcelo...@gmail.com>

Date: Thu, 4 Jun 2009 10:05:35
To: jug.cl<ju...@googlegroups.com>
Subject: Re: Procedimiento almacenado Oracle e Ibatis

jug

unread,
Jun 9, 2009, 12:45:43 AM6/9/09
to jug.cl
Y sigo con mis problemas, claro que ahora voy a colocar el codigo....



Aqui va la funcion...


CREATE OR REPLACE PROCEDURE "SICVEI"."IBATIS" (VALOR_1 in
integer,err_num out integer,err_msg out Varchar2) as temp integer;
BEGIN
err_num:=100;
err_msg:='mensaje';
return;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
err_num := 0;
RAISE;
END;


este es el XML

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd" >
<sqlMap>
<parameterMap id="testIbatis" class="java.util.Map">
<parameter property="valor_1" mode="IN"
javaType="java.lang.Integer"/>
<parameter property="err_num" mode="OUT"
javaType="java.lang.Integer"/>
<parameter property="err_msg" mode="OUT"
javaType="java.lang.String"/>
</parameterMap>
<procedure id="pruebaIbatis" parameterMap="testIbatis">
{call IBATIS(?,?,?)}
</procedure>
</sqlMap>


y aqui va el codigo java

import com.ibatis.sqlmap.client.SqlMapClient;
import java.util.HashMap;
import java.util.Map;

/**
*
* @author marcelo
*/
public class TestIbatis {

public static void main(String[] args) {
SqlMapClient sqlMap = DataBase.getConnection();
Map m = new HashMap();
m.put("valor_1", 0);
m.put("err_num", new Integer(0));
m.put("err_msg", new String());
try {
sqlMap.queryForObject("pruebaIbatis", m);
m.get("err_num");
} catch (Exception e) {
e.printStackTrace();
}
}
}



Y nada funciona, porfaaaaaa ayudaaaaa!!!!!!!!!!!!!!!!!!!111

jug

unread,
Jun 9, 2009, 12:46:58 AM6/9/09
to jug.cl
Ah y se me olvida este es el error que da..

09/06/2009 | 00:46:27,401 | DEBUG | Clase Connection:26 |
{conn-100000} Preparing Call: {call IBATIS(?,?,?)}
09/06/2009 | 00:46:27,669 | DEBUG | Clase SimpleDataSource:26 |
Returned connection 1817166166 to pool.
com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred in cl/fach/sicove/xml/ibatis.xml.
--- The error occurred while executing query procedure.
--- Check the {call IBATIS(?,?,?)}.
--- Check the output parameters (register output parameters failed).
--- Cause: java.sql.SQLException: Tipo de columna no válido
at
com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback
(MappedStatement.java:201)
at
com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForObject
(MappedStatement.java:120)
at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject
(SqlMapExecutorDelegate.java:518)
at
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject
(SqlMapExecutorDelegate.java:493)
at
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject
(SqlMapSessionImpl.java:106)
at
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject
(SqlMapClientImpl.java:82)
at cl.fach.sicove.model.TestIbatis.main(TestIbatis.java:25)
Caused by: java.sql.SQLException: Tipo de columna no válido
at oracle.jdbc.driver.DatabaseError.throwSqlException
(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException
(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException
(DatabaseError.java:208)
at oracle.jdbc.driver.OracleStatement.getInternalType
(OracleStatement.java:3432)
at
oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal
(OracleCallableStatement.java:125)
at
oracle.jdbc.driver.OracleCallableStatement.registerOutParameter
(OracleCallableStatement.java:268)
at
oracle.jdbc.driver.OracleCallableStatement.registerOutParameter
(OracleCallableStatement.java:348)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
com.ibatis.common.jdbc.logging.PreparedStatementLogProxy.invoke
(PreparedStatementLogProxy.java:88)
at $Proxy1.registerOutParameter(Unknown Source)
at
com.ibatis.sqlmap.engine.execution.SqlExecutor.registerOutputParameters
(SqlExecutor.java:431)
at
com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure
(SqlExecutor.java:274)
at
com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery
(ProcedureStatement.java:39)
at
com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback
(MappedStatement.java:189)

jug

unread,
Jun 9, 2009, 4:01:00 PM6/9/09
to jug.cl
Por favor que esto me tiene loco...

Jose Coronel

unread,
Jun 9, 2009, 7:46:07 PM6/9/09
to ju...@googlegroups.com
Prueba definiendo los 'jdbcType' de los parámetros de entrada:

<parameter property="err_num" mode="OUT" jdbcType="NUMERIC" javaType="java.lang.Integer"/>
<parameter property="err_msg" mode="OUT" jdbcType="VARCHAR" javaType="java.lang.String"/>


Saludos


José Coronel

jug

unread,
Jun 9, 2009, 11:39:45 PM6/9/09
to jug.cl
Súper, agradecido a todos quienes contestaron especialmente a José y
Miguel Ángel, pero con esta ultima ayuda de José pude resolver mi
problema y funciono no me había percatado que fue lo mismo que
colocaba Miguel Ángel, así que muchas gracias José, ahora porque hay
que hacerlo asi?, esa es mi duda a estas alturas solo conceptual que
funciono a la perfección.


On 9 jun, 19:46, Jose Coronel <jcoronelcor...@gmail.com> wrote:
> Prueba definiendo los 'jdbcType' de los parámetros de entrada:
> <parameter property="err_num" mode="OUT" jdbcType="NUMERIC"
> javaType="java.lang.Integer"/>
> <parameter property="err_msg" mode="OUT" jdbcType="VARCHAR"
> javaType="java.lang.String"/>
>
> Saludos
>
> José Coronel
>
Reply all
Reply to author
Forward
0 new messages