Ayuda

Hola a todos, alguien me puede ayudar para llamar una función de oracle 11g desde java 7 , 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.

Usa

Imagen de Valerio

Tego este pequeño

Tego este pequeño codigo

package com.conecOracle;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class OracleFuncion {
       
       
static Connection connection = null;
       
        public static Statement conection() throws SQLException {
        try {
               
                Class.forName("oracle.jdbc.OracleDriver");
                //connection= DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.118:1521:xe","IOS_BARAFON","B4r4r3d2012");
                connection= DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.118:1521:XE","Barafon","barafon");
                System.out.println("Conectado a la Base de datos POS BARARED-Oracle");
        }catch (Exception e) {
            System.out.println("Error: Imposible realizar la conexion a BD.");
            e.printStackTrace();
        }
       
       
        return null;
           
               
    }
        public static void main(String a[]) throws SQLException
        {
                conection();
                                 
                 String procedure = "{?,? = call logeo (?,?)}";
                 CallableStatement statement = connection.prepareCall(procedure);

                 statement.registerOutParameter(1, java.sql.Types.VARCHAR);  
                 statement.registerOutParameter(2, java.sql.Types.VARCHAR);
                 statement.setString(3, "Jose");
                 statement.setString(4, "123");
                 
                 ResultSet rs= statement.executeQuery();
                 while (rs.next())
                {
                         String numero=statement.getString(1);                                                  //Recoger el parámetro de salida
                           System.out.println(numero);
                }
        }
}

//////////////////////////////

y esta es la funcion

create or replace
FUNCTION logeo
(
  v_nom IN VARCHAR2 DEFAULT NULL ,
  v_pass IN VARCHAR2 DEFAULT NULL
)
RETURN t_logeo_tab PIPELINED AS
   v_User VARCHAR2(50);
BEGIN

   SELECT NombreAM
     INTO v_User
     FROM TblUserAct
     WHERE Nombre = v_nom
             AND Pass = v_pass;

   IF v_User IS NOT NULL THEN
      PIPE ROW ( t_logeo_row('True', 'Se ha logeado:  ' || v_User ) );

   ELSE
      PIPE ROW ( t_logeo_row('False', ' ') );
   END IF;
END;

//////////////////////////////////////
el error que me sale es

Conectado a la Base de datos POS BARARED-Oracle
Exception in thread "main" java.sql.SQLException: Cadena SQL92 con formato incorrecto en la posición: 2. Expecting "=" got ","
        at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
        at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
        at oracle.jdbc.driver.OracleSql.handleFunction(OracleSql.java:1266)
        at oracle.jdbc.driver.OracleSql.handleToken(OracleSql.java:1226)
        at oracle.jdbc.driver.OracleSql.handleODBC(OracleSql.java:1136)
        at oracle.jdbc.driver.OracleSql.parse(OracleSql.java:1053)
        at oracle.jdbc.driver.OracleSql.getSql(OracleSql.java:310)
        at oracle.jdbc.driver.OracleSql.getSqlBytes(OracleSql.java:604)
        at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:177)
        at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:950)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1222)
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3387)
        at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3431)
        at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
        at com.conecOracle.OracleFuncion.main(OracleFuncion.java:44)

Pusiste dos valores de

Pusiste dos valores de retorno

? , ? = ....

Por eso dice que esperaba un igual y se encontro con una coma

? = ....

Tu funcion regresa solamente un valor ( se pueden regresar mas en PL/SQL? creo que no )

...
RETURN t_logeo_tab PIPELINED AS
   v_User VARCHAR2(50);
BEGIN....

btw, utiliza el tag <code> cuando postees codigo

Imagen de Valerio

Asi lo hice

ya lo correji y me que do asi

public static void main(String a[]) throws SQLException
        {
                conection();
                                 
                 CallableStatement statement = connection.prepareCall( "{?= call logeo(?,?)}");

                 statement.registerOutParameter(1, java.sql.Types.VARCHAR);  
                 statement.setString(2, "Jose");
                 statement.setString(3, "123");
                 statement.execute();

                  ResultSet rs=statement.getResultSet();
                rs.next();
                         String numero=statement.getString(1);                                                  //Recoger el parámetro de salida
                           System.out.println(numero);
               
        }

ahora el error es :

Conectado a la Base de datos POS BARARED-Oracle
Exception in thread "main" java.sql.SQLException: ORA-06550: line 1, column 10:
PLS-00653: aggregate/table functions are not allowed in PL/SQL scope
ORA-06550: line 1, column 13:
PLS-00382: expression is of wrong type
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1034)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:191)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:950)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1222)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3387)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3488)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:3857)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1374)
at com.conecOracle.OracleFuncion.main(OracleFuncion.java:41)

Al parecer no puedes usar

Al parecer no puedes usar pipelines.

http://stackoverflow.com/questions/2779495/pipelined-function-calling-an...
https://forums.oracle.com/thread/312319

Al parecer tu funcion podria ser reescrita sin eso.

Imagen de Valerio

Lo que pasa es que las

Lo que pasa es que las funciones no los hago yo sino que una persona experta en PL SQL

la pregunta es:

¿Qué me recomienda en este caso?

¿Qué cambien el desarrollo de las funciones ?

la verdad yo no se nada de Oracle y PL SQL

Imagen de paranoid_android

Exponer tu funcion en un Stored Procedure o Package

Recuerdo que en Oracle no puedes usar las funciones desde Java, por lo que necesitarías acceder a ella por medio de un Procedimiento Almacenado o un Paquete. Aunque para la versión que manejas no sé si siga aplicando la restricción.

Imagen de Valerio

Gracias

Gracias por la información, es que me dijeron que intentara llamar una funcion de Oracle desde java , ya lo hice de la forma correcta pero me sale errores que son de oracle

PLS-00653: aggregate/table functions are not allowed in PL/SQL scope
ORA-06550: line 1, column 13:
PLS-00382: expression is of wrong type
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored