• Publicidad

Can't call method "prepare"

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Can't call method "prepare"

Notapor Kiloko » 2008-07-09 17:06 @754

Buen día, perleros, tengo un pequeño programa que se encarga de generar un reporte, en base a la consulta de una BD, pero me está mandando un error, jale pero en vez de generar los 210 archivos que debería solo me genera 105.
No sé si algo así les haya pasado antes.

Error.
Código: Seleccionar todo
Can't call method "prepare" on an undefined value at /export/home/colshcp/reportes_mensuales/Febrero/conv_1.pl line 48.
DBI connect('','load@dnet',...) failed: ORA-12535: TNS:operation timed out (DBD ERROR: OCIServerAttach) at /export/home/colshcp/reportes_mensuales/Febrero/conv_1.pl line 43


Sección de código a la que pertenece
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $dbh=DBI->connect("DBI:Oracle:" , "$user\@$instancia", "$pass") ;

        #SELECCIONO TODOS LOS CIRCUITOS

     my $strSql=qq~Select idcid,cid from cids where idcliente=11222 and estado=1 and idcid in ($todos_cids)~;
     my $sth=$dbh->prepare("$strSql");
        $sth->execute();

        my $hash;
                        while(my @lista=$sth->fetchrow_array){
                                $hash->{$lista[0]}=$lista[1];
                        }
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


No sé cómo vean si les ha pasado algo así o si puedan ver dónde está el error, ??
help help

Saludos. Por cierto, ya terminé mi franquenstain para polear, insertar y transformar, mañana pongo el código... Mil gracias.
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Publicidad

Notapor explorer » 2008-07-09 17:40 @777

Yo veo un par de cosas raras...

* Las comillas que rodean a $pass y $strSql, sobran.

* Se hace la conexión con connect(), pero no se comprueba que se haya hecho la conexión de forma correcta. De hecho, eso es justo lo que dice el error: no hubo conexión con la base de datos.

* El while no me gusta... quiero decir que fetchrow_array() devuelve el resultado en una sola llamada... creo.

En cuanto a que solo salgan 105 en lugar de 210, pues no sé... deberás comprobar las consultas de las bases de datos, para ver si devuelven los valores correctos.
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 Kiloko » 2008-07-10 09:44 @447

Te voy a ser sincero, yo soy malo para programar, lo admito, pero este programa parece que fue hecho con las patas y para que yo diga eso mira que esta cañón.

Pero bueno el problema va más a fondo, no es el programa en sí, es la BD, la consulta que realiza es demasiado pesada, y truena, de ahí la falla, además que el equipo en donde está corriendo, también está muy cargado.

Estoy optando por dividir el programa, en segmentos, de consulta, con esto espero no cargar tanto la BD,

Saludos.
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Notapor explorer » 2008-07-10 11:15 @510

Quizás puedas arreglarlo aumentando el tiempo de 'timeout' de las consultas...
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 Kiloko » 2008-07-10 14:18 @637

mmmm,.. Pues aquí la cuestión es que son 2 archivos los que se ejecutan, primero uno que carga las variables
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
print " Ejecutando el Script\n" ;
#Este script sirve para lanzar n instancias del script principal para que sean como threads.

use strict;
use warnings;

my $path="/export/home/colshcp/reportes_mensuales/Febrero/";

system $path ."conv_1.pl 3591,103597,103599,73862,73863,105652,106512,106513,80065,98442 >> $path/log_conv.log  &";
system $path ."conv_1.pl 3573,103582,103583,103568,103510,103465,98444,98445,98446,98447 >> $path/log_conv.log &";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y así con otras 40 líneas.

Mi idea es disminuir estas 40 líneas, en 3 segmentos, porque...

Después el programa que hace la consulta.

Con el siguiente programa... tomando los valores del primero (conv_1.pl)

Lo primero que tengo que modificar, después de hacer que el proceso funcione, es modificar lo de las fechas, porque actualmente hay que hacerlo a patín, con cada mes,

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#use warnings;
use DBI;

my $user="local";
my $pass="2003";
my $instancia="xpaxt";
my $path="/reportesmensuales/archivos/";
my $imprime="";

#============== Variables para tabla de sumarización =================
my $total_poleos=0;
my $disponibilidad=0;
my $pdisp=0;

my $tlat1=0;
my $tlat2=0;
my $tlat3=0;

my $slat1=0;
my $slat2=0;
my $slat3=0;

my $plat1=0;
my $plat2=0;
my $plat3=0;

#=====================================================================

my $archivo="";
my @fechas = ('20080601','20080602','20080603','20080604','20080605','20080606','20080607','20080608','20080609','20080610','
20080611'
,'20080612','20080613','20080614','20080615','20080616','20080617','20080618','20080619','20080620','20080621','2008
0622'
,'20080623','20080624','20080625','20080626','20080627','20080628','20080629','20080630');

##(select fecha,disponibilidad,latencia from final_plv where idcid=$IDCID and clase=1 and fecha >= to_date('20080601 0000','YYYYMMDD HH24MI') and fecha <=to_date('20080630 235900','YYYYMMDD HH24MISS')) uno

#my @fechas=('20080601','20080602');
my $todos_cids=$ARGV[0];

my @horas=('0000','0005','0010','0015','0020','0025','0030','0035','0040','0045','0050','0055','0100','0105','0110','0115','0
120'
,'0125','0130','0135','0140','0145','0150','0155','0200','0205','0210','0215','0220','0225','0230','0235','0240','0245','
0250'
,'0255','0300','0305','0310','0315','0320','0325','0330','0335','0340','0345','0350','0355','0400','0405','0410','0415',
'0420','0425','0430','0435','0440','0445','0450','0455','0500','0505','0510','0515','0520','0525','0530','0535','0540','0545'
,'0550','0555','0600','0605','0610','0615','0620','0625','0630','0635','0640','0645','0650','0655','0700','0705','0710','0715
'
,'0720','0725','0730','0735','0740','0745','0750','0755','0800','0805','0810','0815','0820','0825','0830','0835','0840','084
5'
,'0850','0855','0900','0905','0910','0915','0920','0925','0930','0935','0940','0945','0950','0955','1000','1005','1010','10
15'
,'1020','1025','1030','1035','1040','1045','1050','1055','1100','1105','1110','1115','1120','1125','1130','1135','1140','1
145'
,'1150','1155','1200','1205','1210','1215','1220','1225','1230','1235','1240','1245','1250','1255','1300','1305','1310','
1315'
,'1320','1325','1330','1335','1340','1345','1350','1355','1400','1405','1410','1415','1420','1425','1430','1435','1440',
'1445','1450','1455','1500','1505','1510','1515','1520','1525','1530','1535','1540','1545','1550','1555','1600','1605','1610'
,'1615','1620','1625','1630','1635','1640','1645','1650','1655','1700','1705','1710','1715','1720','1725','1730','1735','1740
'
,'1745','1750','1755','1800','1805','1810','1815','1820','1825','1830','1835','1840','1845','1850','1855','1900','1905','191
0'
,'1915','1920','1925','1930','1935','1940','1945','1950','1955','2000','2005','2010','2015','2020','2025','2030','2035','20
40'
,'2045','2050','2055','2100','2105','2110','2115','2120','2125','2130','2135','2140','2145','2150','2155','2200','2205','2
210'
,'2215','2220','2225','2230','2235','2240','2245','2250','2255','2300','2305','2310','2315','2320','2325','2330','2335','
2340'
,'2345','2350','2355');

my $dbh=DBI->connect("DBI:Oracle:","$user\@$instancia","$pass");

        #SELECCIONO TODOS LOS CIRCUITOS


     my $strSql=qq~Select idcid,cid from cids where idcliente=11222 and estado=1 and idcid in ($todos_cids)~;
     my $sth=$dbh->prepare($strSql);
        $sth->execute();

        my $hash;
                        while(my @lista=$sth->fetchrow_array){
                                $hash->{$lista[0]}=$lista[1];
                        }

foreach my $IDCID (keys %{$hash}) {

# inicializó variables para sumarización
$total_poleos=0;  
$disponibilidad=0;
$pdisp=0;          
                   
$tlat1=0;          
$tlat2=0;          
$tlat3=0;          
                   
$slat1=0;          
$slat2=0;          
$slat3=0;          
                   
$plat1=0;          
$plat2=0;          
$plat3=0;

$imprime="";
#==========================================


        my $qrymes=qq~ Select to_char(uno.fecha,'YYYYMMDD HH24MI'),
                nvl(uno.disponibilidad, nvl(dos.disponibilidad,nvl(tres.disponibilidad,0)))*1,
                nvl(replace(uno.latencia,',','.'),0),
                nvl(replace(dos.latencia,',','.'),0),
                nvl(replace(tres.latencia,',','.'),0),
                to_char(uno.fecha,'DD/MM/YYYY HH24:MI')
                from
(select fecha,disponibilidad,latencia from final_plv where idcid=$IDCID and clase=1 and fecha >=to_date('20080601 0000','YYYY
MMDD HH24MI'
) and fecha <=to_date('20080630 235900','YYYYMMDD HH24MISS')) uno
left join (select fecha,disponibilidad,latencia from final_plv where idcid=$IDCID and clase=2 and fecha >=to_date('20080601 0
000'
,'YYYYMMDD HH24MI') and fecha <=to_date('20080630 235900','YYYYMMDD HH24MISS')) dos on dos.fecha=uno.fecha
left join (select fecha,disponibilidad,latencia from final_plv where idcid=$IDCID and clase=3 and fecha >=to_date('20080601 0
000'
,'YYYYMMDD HH24MI') and fecha <=to_date('20080630 235900','YYYYMMDD HH24MISS')) tres on tres.fecha=uno.fecha~;

        $sth=$dbh->prepare($qrymes);
        $sth->execute();

        my $hashmes;
                        while(my @lista=$sth->fetchrow_array){
                                $hashmes->{$lista[0]}->{1}=$lista[1];
                                $hashmes->{$lista[0]}->{2}=$lista[2];
                                $hashmes->{$lista[0]}->{3}=$lista[3];
                                $hashmes->{$lista[0]}->{4}=$lista[4];
                                $hashmes->{$lista[0]}->{5}=$lista[5];
                        #       $lista[2],$lista[3],$lista[4]);
                        }

my @anterior=(0,0,0,0);
       
        foreach my $fecha (@fechas) {
                foreach my $hora (@horas) {

                        $total_poleos+=1;

                        if(exists($hashmes->{"$fecha $hora"}))
                        {
        #@anterior=($hashmes->{"$fecha $hora"}->{1],$hashmes->{"$fecha $hora"}->{2],$hashmes->{"$fecha $hora"}->{4],$hashmes->{"$fecha $hora"}->{4]);
                                $anterior[0]=$hashmes->{"$fecha $hora"}->{1};
                                $anterior[1]=$hashmes->{"$fecha $hora"}->{2};
                                $anterior[2]=$hashmes->{"$fecha $hora"}->{3};
                                $anterior[3]=$hashmes->{"$fecha $hora"}->{4};
                               
                                $disponibilidad+=1 if ($hashmes->{"$fecha $hora"}->{1} ==1);
                                if( $hashmes->{"$fecha $hora"}->{2} >0)
                                {
                                        $tlat1+=1 ;
                                        $slat1+=$hashmes->{"$fecha $hora"}->{2};
                                }
                                if( $hashmes->{"$fecha $hora"}->{3} >0)
                                {
                                        $tlat2+=1 ;
                                        $slat2+=$hashmes->{"$fecha $hora"}->{3};
                                }
                                if( $hashmes->{"$fecha $hora"}->{4} >0)
                                {
                                        $tlat3+=1 ;
                                        $slat3+=$hashmes->{"$fecha $hora"}->{4};
                                }

        $imprime.= $hashmes->{"$fecha $hora"}->{5}.",".$hashmes->{"$fecha $hora"}->{1}.",".$hashmes->{"$fecha $hora"}->{2}.",
"
.$hashmes->{"$fecha $hora"}->{3}.",".$hashmes->{"$fecha $hora"}->{4}."\n";
                        }
                        else
                        {
                                my $fecha_fmt=$fecha;
                                my $hora_fmt=$hora;
                                $fecha_fmt=~ s/(\d\d\d\d)(\d\d)(\d\d)/$3\/$2\/$1/;
                                $hora_fmt=~ s/(\d\d)(\d\d)/$1:$2/;
                               
                                $disponibilidad+=1 if ($anterior[0] ==1);
                                if( $anterior[1] >0)
                                {
                                        $tlat1+=1;
                                        $slat1+=$anterior[1];
                                }
                               
                                if( $anterior[2] >0)
                                {
                                        $tlat2+=1;
                                        $slat2+=$anterior[2];
                                }
                               
                                if( $anterior[3] >0)
                                {
                                        $tlat3+=1;
                                        $slat3+=$anterior[3];
                                }
        $imprime.= $fecha_fmt." ".$hora_fmt.",".$anterior[0].",".$anterior[1].",".$anterior[2].",".$anterior[3]."\n";
                        }
                }
        print $IDCID."=>".$fecha."\n";
        }

if ($tlat1==0) {$tlat1=1;}
if ($tlat2==0) {$tlat2=1;}
if ($tlat3==0) {$tlat3=1;}

$plat1=$slat1/$tlat1;
$plat2=$slat2/$tlat2;
$plat3=$slat3/$tlat3;

$pdisp  = ($disponibilidad/$total_poleos)*100;
$pdisp .= '%';

open  (my $archivo,">".$path.$hash->{$IDCID}.".csv");

print $archivo "Poleos,$disponibilidad,$pdisp\n";
print $archivo "\n";
print $archivo "Latencias,$tlat1,$tlat2,$tlat3\n";
print $archivo "Suma,$slat1,$slat2,$slat3\n";
print $archivo "Promedio,$plat1,$plat2,$plat3\n";
print $archivo "\n";
print $archivo "\n";
print $archivo "FECHA,DISPONIBILIDAD,LATENCIA_INTERACTIVOS,LATENCIA_DIFERIDOS,LATENCIA_CONVERSACIONALES\n";
print $archivo $imprime;

close $archivo;
# Tomo los sitios
$strSql=qq~select c.idcid,s.nombre from cids c,sitios s, sitios_cid t
where s.idcliente=11222 and c.idcid=t.idcid and s.idsitio=t.idsitio and c.estado=1~;

        my $sth=$dbh->prepare("$strSql");
        $sth->execute();

        my $sitios;
                        while(my @lst=$sth->fetchrow_array){
                                $sitios->{$lst[0]}=$lst[1];
                        }
# imprimo en el archivo general
open (TODOS,">>".$path."todos_cids.csv");
print TODOS $hash->{$IDCID}.",".$sitios->{$IDCID}.",".$disponibilidad.",".$pdisp.",".$plat1.",".$plat2.",".$plat3.",".$tlat1.
",".$tlat2.",".$tlat3."\n";
close TODOS;

}
Coloreado en 0.010 segundos, usando GeSHi 1.0.8.4
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Notapor explorer » 2008-07-10 17:22 @765

Pero... ¿cómo es eso de escribir los 40 procesos a la vez en el mismo fichero? No me parece muy adecuado...
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 Kiloko » 2008-07-10 18:34 @815

Pues a mí tampoco pero actualmente es así como funciona, causa de que la BD se sature, por eso propongo dividir esos procesos.
Nunca interrumpas a tu enemigo cuando está cometiendo un error
Napoleón Bonaparte
Avatar de Usuario
Kiloko
Perlero nuevo
Perlero nuevo
 
Mensajes: 243
Registrado: 2007-07-10 18:26 @810
Ubicación: MOnterrey NL

Notapor explorer » 2008-07-11 04:11 @216

Anda que la variable @horas... hubiera quedado más corto hacer un bucle:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @horas;
my ($h,$m) = (0,0);
while ($h<24) {
    push @horas, sprintf "%02d%02d", $h, $m;
    $h++ if !($m = ($m + 5) % 60);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 23 invitados