Procedimientos almacenados weblogic / jsp

Estoy llamando a un procedimiento almacenado con el cual quiero llenar un listbox con esos datos, pero tengo problemas con el while, tira un error, no sé como usarlo además creo que se debería utilizar un resultset pero también arroja error, el código que tengo es el siguiente:
</SCRIPT>
<html>
<head>
<title>Sucursal</title>
</head>
<body>
<%
java.sql.CallableStatement ps= null;
InitialContext ctxLocal= null;
ctxLocal = new InitialContext();
DataSource ds = (DataSource) ctxLocal.lookup("DS_CINFO");
Connection con = ds.getConnection();
Statement s=con.createStatement();
String sql;
sql="{call s_consulta_sucursal(?,?)}";
ps=con.prepareCall(sql);
ps.registerOutParameter(1, Types.INTEGER);
ps.registerOutParameter(2, Types.VARCHAR);
// ResultSet rs = ps.executeQuery();
ps.execute();
%>
<div align="left"><img src="../boletas/log_corp.gif" width="79" height="120"> </div>
<div align="center"><br>
<em><strong>Consulta por Boletas</strong></em></div>
<form action="flujo_boletas.jsp" name="f" onSubmit="return verifica()">
<table width="77%" border="1" align="center" cellpadding="5" cellspacing="1" bordercolor="#AEC9EC" bgcolor="#99CCFF">
<tr bgcolor="#FFF1C4">
<td width="48%"> <div align="left"><font color="#000066" size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong><em>Sucursal
<select name="Sucursales" size="1" onBlur='if ((document.f.Sucursales.value)== "0") {alert("Seleccione Sucursal");}'>
<option value="0">Seleccione Sucursal</option>
<%
while(ps.next()) {
%>
<option value= "<%=ps.getInt(1)%>"><%=ps.getInt(1)%>
- <%=ps.getString(2)%> </option>
<% } %>
</select>
</em></strong></font></div></td>
<td width="62%"><font color="#000066" size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong><em>Fecha:
Mes </em></strong></font>
<select name="Mes" size="1" onBlur='if ((document.f.Mes.value)=="0") {alert("Seleccione Mes");}'>
<option value= "0" >Mes</option>
<% for (int i = 1; i < 13; i++) { %>
<option value= "<%= i %>"> <%= i %> </option>
<% }%>
</select>
<font color="#000066" size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong><em>;
Año</em></strong></font>
<select name="Agno" size="1" onBlur='if ((document.f.Agno.value)=="100") {alert("Seleccione Año");}'>
<option value= "100" >Año</option>
<% // ver el formato del despliegue de la fecha o si se captura de otro lado
for (int i =0; i < 99; i++) {
%>
<option value= "<%= i %>"> <%= i %> </option>
<% }%>
</select> </td>
</tr>
<%
ps.close();
s.close();
con.close();
%>
<tr bgcolor="#D4E2F5">
<td width="48%" bordercolor="#AEC9EC"> </td>
<td width="62%" bordercolor="#AEC9EC"> <input type="submit" value="Buscar" name="B1" ></td>
</tr>
</table>
</form>
</body>
</html>

1 respuesta

Respuesta
1
Recisa este código... es un ejemplo completo de cómo ejectutar un proceso almacenado que devuelve un enetero...
public void executeProcess(String processname) {
try {
Connection conn = getConnection();
System.out.println("Se abre la conexión a la BD");
int result = executeProcess(processName,conn);
conn.close();
} catch (SQLException e) {
e.printStackTrace();
System.out.println("Se ha producido una excepción SQL");
}catch (Exception ex){
ex.printStackTrace();
System.out.println("Se ha producido una excepción En el metodo RUN");
}
}
private Connection getConnection() throws SQLException,Exception {
// retornas la conexión
}
public int executeProcess(String processName,Connection conn) throws SQLException
{
processName = "begin " + processName + "; end;";
CallableStatement prog = conn.prepareCall(processName);
prog.registerOutParameter(1, Types.INTEGER);
prog.execute();
int registersProcessed = prog.getInt(1);
prog.close();
return registersProcessed;
}
Aquí va el error...
Compilation of 'D:\bea\user_projects\mydomain\myserver\.wlnotdelete\DefaultWebApp_DefaultWebApp_6501769\jsp_servlet\_flujo_diario\__consulta2.java' failed:
--------------------------------------------------------------------------------
D:\bea\user_projects\mydomain\myserver\.wlnotdelete\DefaultWebApp_DefaultWebApp_6501769\jsp_servlet\_flujo_diario\__consulta2.java:115: cannot resolve symbol
probably occurred due to an error in /flujo_diario/consulta2.jsp line 67:
while(ps.next()) {
--------------------------------------------------------------------------------
Full compiler error(s):
D:\bea\user_projects\mydomain\myserver\.wlnotdelete\DefaultWebApp_DefaultWebApp_6501769\jsp_servlet\_flujo_diario\__consulta2.java:115: cannot resolve symbol
symbol : method next ()
location: interface java.sql.CallableStatement
while(ps.next()) { //[ /flujo_diario/consulta2.jsp; Line: 67]
^
1 error
Sabes, no entiendo mucho tu explicación, la idea del procedimiento es sacar todos los registros de una tabla el cual tiene un código(int) y un nombre(varchar) y con eso quiero llenar mi listbox. Pero no te entiendo como retorno los valores... ¿me puedes dar un ejemplo?
Gracias
Cuando ejecutas el prepared statement debes asignarlo a un resulset:
ResultSet rs = ps.execute();
Una vez hagas eso tienes que hacer:
while(rs.next()){
// lo que quieras...
}
Dime algo de esta prueba ...
Por lo que veo estás retornando un Varchar...
Siguiendo el ejemplo que te he dado deberías poder tener acceso a ese varchar con esta instrucción:
prog.registerOutParameter(1, Types.VARCHAR);
¿Es así?
No estás retornando un resultset... si no un varchar...
no resulta, probé con varias formas pero no reconoce el resulset, hice también ResultSet rs= ps.executeQuery();
Pero no resulta...
Aquí va el error de lo que me dijiste que probara...
Compilation of 'D:\bea\user_projects\mydomain\myserver\.wlnotdelete\DefaultWebApp_DefaultWebApp_6501769\jsp_servlet\_flujo_diario\__consulta2.java' failed:
--------------------------------------------------------------------------------
D:\bea\user_projects\mydomain\myserver\.wlnotdelete\DefaultWebApp_DefaultWebApp_6501769\jsp_servlet\_flujo_diario\__consulta2.java:110: incompatible types
probably occurred due to an error in /flujo_diario/consulta2.jsp line 54:
ResultSet rs = ps.execute();
--------------------------------------------------------------------------------
Full compiler error(s):
D:\bea\user_projects\mydomain\myserver\.wlnotdelete\DefaultWebApp_DefaultWebApp_6501769\jsp_servlet\_flujo_diario\__consulta2.java:110: incompatible types
found : boolean
required: java.sql.ResultSet
ResultSet rs = ps.execute(); //[ /flujo_diario/consulta2.jsp; Line: 54]
^
1 error
Sí, lo que quiero es llenar una listbox con información que viene de una sentencia sql que llama a un procedimiento almacenado.
Este procedimiento devuelve múltiples registros...
¿Cómo puedo leer todos esos registros?
hay una cosa que no entiendo... ¿por qué has de ejecutar un procedimiento interno de BBDD para hacer una select?
Podrías hacer la select desde un statement y entonces SÍ que podrías tener acceso con un resulset...
A ver si lo he entendido... Lo que quieres ejecutar es un pl en BBDD.. ¿no? Este proceso te devuelve múltiples resultados... ¿no? Y quieres obtener esos resultados y rellenar un listbox... ¿no?
aqui te envio el script del procedimiento para que veas los valores que retorna
CREATE PROCEDURE s_consulta_sucursal (
@codigo int out,
@nombre varchar (50) out)
AS
select @codigo=NumSuc,@nombre=NombreSuc from boletas.sucursales
Ok,
Creo que tengo algo ...
Te digo algo...
¿Qué tipo devuelve tu procedimiento de BBDD?
De hecho lo tenía así como me dices y funcionaba todo bien, pero me exigen hacer todo por procedimientos almacenados. Y ahí es donde nace el problema...
Esto me resulta, ya lo había probado, el problema es cuando quiero sacar varios registros que resultan de la llamada del procedimiento. Por ejemplo llenar un listbox... cuando hago el while para sacar varios, no resulta, sé que se debería usar un Resulset pero también arroja error... ¿me entiendes?
Gracias por tu paciencia
¿Puedes enviarme el error?
Saludos,
N
Ok
De ahí te cuento como me fue con tus referencias
No he encontrado el código exacto... pero sí que tengo un par de referencias (que me sirvieron a mi para hacer lo mismo que quieres hacer tú):
http://www.experts-exchange.com/Programming/Programming_Languages/Java/Q_20247262.html
http://home.tiscali.nl/~bmc88/java/sbook/0131.html
Son dos ejemplos muy buenos. Verás que el resulset que se utiliza es el propio de Oracle (no el "genérico" del API java.sql.*). Esto es importante porque si no haces el cast no te funcionará...
Una cosa más... si no queréis tener problemas de integración posteriores y ser independientes de la BBDD al 100%, deberías tratar los resultados en XML... pero esto es una opinión personal! Mírate los ejemplos... creo que te servirán.
Una cosa más...
En otn. Oracle.com podrás encontrar al detalle las clases orientadas a su propio driver.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas