
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:
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
Código de la clase Conexión:
El error ocurre en la línea
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.
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


0