style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Ayuda

Hola alguien me puede ayudar de como llamar una Funcion de oracle 11g desde java,
acá el Store

create or replace
FUNCTION mes
RETURN t_mes_tab PIPELINED AS
   v_sem NUMBER(10,0);
   v_dia NUMBER(10,0);
   v_x NUMBER(10,0);
   v_f1 DATE;
   v_f2 DATE;
BEGIN
   v_x := utils.datepart('WK', SYSDATE) ;
   v_sem := 0 ;
   WHILE ( v_sem < v_x )
   LOOP
      BEGIN
         v_dia := 7 ;
         v_dia := v_dia * v_sem ;
         --select DATEADD(day, @dia,'2012-12-31') as Inicial, DATEADD(day, @dia,'2013-01-01')+5  as Final
         v_f1 := utils.dateadd('DAY', v_dia, '2012-12-24') ;
         v_f2 := utils.dateadd('DAY', v_dia, '2012-12-24') + 6 ;
                 PIPE ROW (t_mes_row(v_f1, v_f2));
         v_sem := v_sem + 1 ;
      END;
   END LOOP;
END;

y de esta forma intento llamar La Funcion desde Java

public static void main(String a[]) throws SQLException
        {
                conection();
                 String sql = "", dato="";          
                 sql = "{ begin mes(?,?); end;}";
                 
                 CallableStatement cs = null;
                 try{
                         cs = connection.prepareCall(sql);
                         cs.registerOutParameter(1, Types.VARCHAR);
                         cs.registerOutParameter(2, Types.VARCHAR);
                         cs.execute();
                         dato = cs.getString(1);
                         System.out.println(dato);
                 }catch (Exception e){
                         e.printStackTrace();
                 }
               
        }

al correrlo la Funsion en Sql Developer me sale esto

24/12/12 30/12/12
31/12/12 06/01/13
07/01/13 13/01/13
14/01/13 20/01/13

eso es lo que yo quiero mostrarlo pero desde java, Espero y me ayuden

Saludos

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Sr. Negativo

Llamar a una función SQL Oracle

Tal vez te sirva esto: Aqui

Imagen de Valerio

este en mi codigo

este en mi codigo

conection();
                 String dato="";        
                 CallableStatement cs = connection.prepareCall("?? = call mes() ");
                 try{
                         cs.registerOutParameter(1, java.sql.Types.DATE);
                         cs.registerOutParameter(2, java.sql.Types.DATE);
                         cs.execute();
                         
                         dato = cs.getString(1);
                         System.out.println(dato);
                 }catch (Exception e){
                         e.printStackTrace();
                 }
 

la funsion esta realizada desde oracle 11g y me retorna esto:
24/12/12 30/12/12
31/12/12 06/01/13
07/01/13 13/01/13
14/01/13 20/01/1
ejecutando la funcion desde Sql developer

Pero al ejecutarlo desde java me sale este error
Conectado a la Base de datos POS BARARED-Oracle
java.sql.SQLException: ORA-00900: invalid SQL statement

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:330)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:287)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:753)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:217)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:970)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1191)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3414)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3520)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4611)
at com.conecOracle.OracleFuncion.main(OracleFuncion.java:36)

Saludos..................

Re: este es mi código

Creo que te debería bastar con cambiar el parámetro de preparCall por: "{call mes(?,?)}"
Y ya estaría. ¿Puedes probar?

Imagen de Valerio

Mi codigo quedo Asi

                 conection();
                 String dato="";        
                 CallableStatement cs = connection.prepareCall("{call mes(?,?)}");
                 try{
                         cs.registerOutParameter(1, java.sql.Types.DATE);
                         cs.registerOutParameter(2, java.sql.Types.DATE);
                         cs.execute();
                         
                         dato = cs.getString(1);
                         System.out.println(dato);
                 }catch (Exception e){
                         e.printStackTrace();
                 }
       

Y como resultado me salio esto

Conectado a la Base de datos POS BARARED-Oracle
java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'MES'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:330)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:287)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:753)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:217)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:970)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1191)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3414)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3520)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4611)
at com.conecOracle.OracleFuncion.main(OracleFuncion.java:36)

Imagen de julgo

parametros

en tu función create or replace FUNCTION mes no veo ningún parámetro debería ser create or replace function mes(PARAMETRO1 TIPODATO, PARAMETRO2 TIPODATO) donde parametro1 y parametro2 son los nombres q les debes dar a las variables y definir que tipo son, y averigua como se llama a la función no debes confundirla con procedimientos almacenados .
Aquí el código le envía dos parámetros pero la función no espera ninguno (asi esta tu función mes)pero el código java no espera valor de retorno .CallableStatement cs = connection.prepareCall("{call mes(?,?)}"); y con este
CallableStatement cs = connection.prepareCall("?? = call mes() "); no envia parámetros pero la funcion no puede retornar dos valores

Imagen de Valerio

ESTA FUNSION

ESTA FUNSION LO HICIERON LOS EXPERTOS DE ORACLE, ELLOS ME LO PASARON TAL Y COMO ESTA PARA QUE LO LLAME DESDE JAVA

create or replace
FUNCTION mes
RETURN t_mes_tab PIPELINED AS
   v_sem NUMBER(10,0);
   v_dia NUMBER(10,0);
   v_x NUMBER(10,0);
   v_f1 DATE;
   v_f2 DATE;
BEGIN
   v_x := utils.datepart('WK', SYSDATE) ;
   v_sem := 0 ;
   WHILE ( v_sem < v_x )
   LOOP
      BEGIN
         v_dia := 7 ;
         v_dia := v_dia * v_sem ;
         --select DATEADD(day, @dia,'2012-12-31') as Inicial, DATEADD(day, @dia,'2013-01-01')+5  as Final
         v_f1 := utils.dateadd('DAY', v_dia, '2012-12-24') ;
         v_f2 := utils.dateadd('DAY', v_dia, '2012-12-24') + 6 ;
                 PIPE ROW (t_mes_row(v_f1, v_f2));
         v_sem := v_sem + 1 ;
      END;
   END LOOP;
END;

CUANDO LO LLAMO DESDE SLQ DEVELOPER, ME SALE ESTO

F_INICIAL F_FINAL
24/12/12 30/12/12
31/12/12 06/01/13
07/01/13 13/01/13
14/01/13 20/01/1

Y EN JAVA ME MARCA ESTE ERROR

java.sql.SQLException: ORA-00900: invalid SQL statement

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:330)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:287)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:753)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:217)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:970)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1191)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3414)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3520)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4611)
at com.conecOracle.OracleFuncion.main(OracleFuncion.java:36)

Y FINALMENTE EN CODIGO QUEDÓ ASÍ:

public static void main(String a[]) throws SQLException
        {
                conection();
                 String dato="";        
                 CallableStatement cs = connection.prepareCall("?? = call mes()");
                 try{
                         cs.registerOutParameter(1, java.sql.Types.DATE);
                         cs.registerOutParameter(2, java.sql.Types.DATE);
                         cs.execute();
                         
                         dato = cs.getString(1);
                         System.out.println(dato);
                 }catch (Exception e){
                         e.printStackTrace();
                 }
               
        }

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">