Java - Error PLS-00103 al ejecutar un Stored Procedure desde Java

   
Vista:
Imágen de perfil de Octavio

Error PLS-00103 al ejecutar un Stored Procedure desde Java

Publicado por Octavio (6 intervenciones) el 05/07/2015 02:09:23
Hola muy buenas tardes. Estoy trabajando en un proyecto dónde se me solicitó no incluir sentencias sql dentro del código de la aplicación debiendo utilizar Stored Procedures. Este es mi setup de trabajo:

Equipo de desarrollo:

Windows 8.1(64 bits)
SQL Developer 4.0.2.15 (64 bits) con JDK 1.0.7_55 incluido
NetBeans 8.0.2
JDK 1.8.0_45 (64 bits)
Apache Tomcat 8.0.15 (64 bits), versión independiente a la típicamente incluida con NetBeans

Equipo servidor de base de datos:

Windows 7 (32 bits)
Oracle XE 11.2 (32 bits)

Este es el código de un Stored Procedure que debe regresar los datos del usuario que coincidan con el parámetro de entrada:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE PROCEDURE get_usuario(
  p_nombre_usuario IN VARCHAR2,
  p_perfil OUT NUMBER,
  p_nombre OUT VARCHAR2,
  p_apellido OUT VARCHAR2,
  p_hash_contrasena OUT VARCHAR2
)
AS
BEGIN
    SELECT perfil, nombre, apellido, hash_contrasena
    INTO p_perfil, p_nombre, p_apellido, p_hash_contrasena
    FROM usuarios
    WHERE nombre_usuario = p_nombre_usuario;
END;

El código compila y es perfectamente utilizable dentro de Oracle a través del SQL developer.

El siguiente código es de la clase Java que recupera los datos del usuario llamando al Stored Procedure

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package model;
 
import util.Conexion;
import bean.Usuario;
import controller.LoginController;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
 
public class LoginData {
 
    private final Conexion con;
    private CallableStatement cstmt;
    private String sql;
    private Usuario usuario;
 
    public LoginData() {
        this.con = new Conexion();
    }
 
    public Usuario getUsuario(String nombreUsuario) {
 
        usuario = null;
 
        try {
            sql = "{call get_usuario(?,?,?,?,?}";
            cstmt = con.getCallableStatement(sql);
            cstmt.setString(1, nombreUsuario);
            cstmt.registerOutParameter(2, java.sql.Types.NUMERIC);
            cstmt.registerOutParameter(3, java.sql.Types.VARCHAR);
            cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
            cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
 
            cstmt.execute();
 
            if (cstmt.getString(1) != null) {
                usuario = new Usuario();
                usuario.setUsuario(nombreUsuario);
                usuario.setPerfil(cstmt.getInt(2));
                usuario.setNombre(cstmt.getString(3));
                usuario.setApellido(cstmt.getString(4));
                usuario.setHashContraseña(cstmt.getString(5));
            }
 
            con.closeCallableStatement();
        } catch (SQLException ex) {
            Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);
        }
 
        return usuario;
    }
}

Código de la clase Conexión:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package util;
 
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
 
public class Conexion {
 
    private InitialContext ctx = null;
    private Connection conn = null;
    private DataSource ds = null;
    private CallableStatement cstmt = null;
 
    public CallableStatement getCallableStatement(String sql) {
        try {
            ctx = new InitialContext();
            ds = (DataSource) ctx.lookup("java:comp/env/jdbc/myDB");
            conn = ds.getConnection();
            cstmt = conn.prepareCall(sql);
        } catch (NamingException ex) {
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
        }
        return cstmt;
    }
 
    public void closeCallableStatement() {
        try {
            cstmt.close();
            cstmt = null;
            conn.close();
            conn = null;
        } catch (SQLException ex) {
            Logger.getLogger(Conexion.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

El error ocurre en la línea

1
cstmt.execute();

de la clase LoginData

La descripción del error es la siguiente:

java.sql.SQLException: ORA-06550: line 1, column 38:
PLS-00103: Encountered the symbol ";" when expecting one of the following:

. ( ) , * @ % & = - + < / > at in is mod remainder not rem =>
<an exponent (**)> <> or != or ~= >= <= <> and or like like2
like4 likec between || indicator multiset member submultiset
The symbol ")" was substituted for ";" to continue.

No entiendo que pueda estar haciendo mal, ya que como mencioné antes, el Stored Procedure funciona como debe dentro de Oracle.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Error PLS-00103 al ejecutar un Stored Procedure desde Java

Publicado por walter_100 (14 intervenciones) el 05/07/2015 05:42:15
Para mi es problema esta en el paso de parametros.

usuario.setUsuario(nombreUsuario(1));

Lo primero que controlo es el orden en que la clase envia los datos y que sea del tipo de dato que recibe el store procedure. Si mi store tiene 20 campos para cargar. primero armo uno chico de 2 o 3 campos. Cuando este me funciona cuando la clase envia los datos bien y el store lo recibe bien. Le agrego de a 5 campos con esta forma de hacerlo me ahorro muchos dolores de cabeza y perdida de tiempo.


Walter.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Octavio

Error PLS-00103 al ejecutar un Stored Procedure desde Java

Publicado por Octavio (6 intervenciones) el 10/09/2015 00:52:12
Gracias, cometí un error absurdo, me falto un paréntesis en la línea 29:

1
sql = "{call get_usuario(?,?,?,?,?}";
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar