• Publicidad

Problemas con DBI

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problemas con DBI

Notapor Fegna » 2008-02-27 13:16 @594

Hola, tengo un problema con DBI que se da cuando ejecuto un procedimiento almacenado que me trae datos y la respuesta es 0 registros (cuando existen datos me los trae sin problemas).

El punto es que al ejecutar execute el programa me envía a la #%#&%#& (censurado).

Estoy trabajando bajo ambiente Windows.

Gracias.
Fegna
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-01-08 09:29 @437
Ubicación: Santiago, Chile

Publicidad

Notapor explorer » 2008-02-27 13:35 @608

Estaría interesante ver el código que usas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Fegna » 2008-02-27 13:42 @613

Mmmmm, claro, aquí va (debí haberlo pensado antes):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        my ($mytipo_plan, $myregion, $mycotizacion_uf, $mylista_benef, $conn) = @_;
        my ($sth, $stmt, $csr, $disconnect, @result);

        if (!$conn)
                {
                $conn = get_db_connection();
                $disconnect = 1;
                }

        $stmt = "BEGIN
                ClieObtSimulacionPlanii_PKG.ClieObtSimulacionPlan(
'',:TIPO_PLAN,:REGION,:COTIZACION_UF,:LISTA_BENEF,5,5,:CSR);
                END;"
;
        $sth = $conn->prepare($stmt);
       
        $sth->bind_param_inout( ":TIPO_PLAN", \$mytipo_plan, 12);
        $sth->bind_param_inout( ":REGION", \$myregion, 1);
        $sth->bind_param_inout( ":COTIZACION_UF", \$mycotizacion_uf, 1);
        $sth->bind_param_inout( ":LISTA_BENEF", \$mylista_benef, 1);
        $sth->bind_param_inout( ":CSR", \$csr, 0, { ora_type => ORA_RSET } );

        $sth->execute(); # FALLA!!!
        $sth->finish;
        while (my $hash_ref = $csr->fetchrow_hashref)
                {
                $hash_ref->{'CODIGOPLAN'} =~ s/ //g;

                push(@result, $hash_ref);
                }
        $csr->finish;
        if ($disconnect)
                {
                $conn->disconnect;
                }

        return(@result);
 
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


He destacado la línea que me arroja problemas.

Además, envío el mensaje donde Perl me manda a pasear:
Código: Seleccionar todo
CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers.


Creo que es toda la información.

Gracias.
Fegna
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-01-08 09:29 @437
Ubicación: Santiago, Chile

Notapor explorer » 2008-02-27 13:58 @624

El mensaje de error dice que es un fallo de CGI, no de DBI.

Sospecho que debe de ocurrir un error al hacer la consulta, y ese error estará saliendo antes de que saques la cabecera 'Content-Type:'.

De todas formas, hay algo que no me gusta. ¿Defines $csr como un parámetro para entrada y salida de datos de la base de datos, y, unas líneas más abajo, lo utilizas para hacer el fetchrow? Eso no me cuadra...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Fegna » 2008-02-27 14:08 @630

El parámetro $csr contiene un cursor.

Lo curioso respecto al error es que, cuando el procedimiento llamado me devuelve registros, el programa funciona bien (no se cae ni por CGI ni por DBI).

Lamentablemente no tengo acceso al procedimiento en cuestión (tal vez, cuando no encuentra registros a devolver, devuelve una cosa diferente a un cursor y pasa por allí el error).

Respecto a la cabecera, la envío antes de llamar a ésta función, de hecho lo hago después de inicializar las variables de la rutina principal.
Fegna
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-01-08 09:29 @437
Ubicación: Santiago, Chile

Notapor explorer » 2008-02-27 14:25 @642

Pero... ¿El procedimiento almacenado puede devolver un cursor en una variable que, INTERNAMENTE, sea un apuntador a un objeto DBI en Perl?

Además, el primer parámetro de bind_param_inout debería ser un número, empezando en 1, no constantes de caracteres.

No sé... dices que funciona pero yo veo cosas muy raras. Prueba a usar el módulo CGI::Carp de esta manera: use CGI::Carp qw(fatalsToBrowser);. Así los errores saldrán en el navegador.

También puedes probar a ejecutarlo paso a paso, con el perl -d o con el programa ddd y así puedes ver el contenido de las variables y dónde se cae.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2008-02-27 14:28 @644

Disculpas. Acabo de ver código de Oracle, que, efectivamente, funciona de la manera que pones.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2008-02-27 14:30 @646

¿Has probado a mover la línea

$sth->finish;

justo antes de la línea

$csr->finish;

?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Fegna » 2008-02-27 14:40 @653

Lo realicé y es lo mismo.

De hecho he detenido la ejecución de la rutina línea a línea (llevando el return(@result); después de ejecutar cada una de ellas) y, donde me muestra el error es cuando ejecuta $sth->execute();.
Fegna
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-01-08 09:29 @437
Ubicación: Santiago, Chile

Notapor Fegna » 2008-02-27 14:55 @663

Por lo menos, con use CGI::Carp qw(fatalsToBrowser); la página no se me cae.

El primer paso ya está dado. Ahora veré como enviarle un mensaje al usuario diciendo que no encontré registros.

Gracias por la ayuda.
Fegna
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2008-01-08 09:29 @437
Ubicación: Santiago, Chile

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 3 invitados

cron