• Publicidad

Conexión a Oracle

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

Conexión a Oracle

Notapor animal collective » 2012-01-10 14:46 @657

Estimados,

Junto con saludarlos, necesito realizarles la siguiente consulta.

Estoy programando un script en Perl que se conecta a una BD Oracle y retorna un número entero. Este número entero lo comparo con un valor X, y si pasa el umbral establecido envío una alerta a través de correo electrónico.

Mi problema es que el código es muy poco profesional. Necesito saber cómo poder realizar de mejor forma la conexión a la base de datos para traer el valor que retorna, como también si hay alguna forma de capturar los errores de conexión y guardarlos en una variable para que estos también puedan ser enviados por correo.

Les comento que mi código sí funciona, pero cuando la base de datos está caída el script no detecta esto.

Adjunto el código que he realizado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\Perl\bin\perl.exe -w
  2. #Transacciones
  3. use MIME::Lite;
  4. use strict;
  5. use POSIX 'strftime';
  6. my $alerta;
  7. my $fecha = strftime "%d-%m-%Y %H:%M:%S", localtime;
  8. my $var;
  9. my $valor;
  10.  
  11. $valor=`sqlplus -S usuario/pass\@tnsname \@F:\\QRY/consulta.sql`;
  12. $var= $valor + 0;
  13.  
  14. my $message = MIME::Lite->new(
  15.         From    => '[email protected]',
  16.         To      => '[email protected]',
  17.         Subject => "DIF MIN REPLICA",
  18.         Data    => "Minutos de desfase entre hora actual y hora de ultima transacción en réplica: ".$var." Minutos",
  19. );
  20.        
  21. MIME::Lite->send('smtp','server_correo',Timeout=>60);
  22.  
  23. if($var >= 12)
  24. {
  25.    $message->send();
  26.    open(LECTURA,">>/LOG/ARGENTINA/DIF_MIN_REPLICA.csv");
  27.    print LECTURA $fecha." ; ".$var." ; CRITICAL \n";
  28.    close(LECTURA);
  29. }
  30. else
  31. {
  32.  if($var < 12)
  33.  {
  34.    open(LECTURA,">>/LOG/ARGENTINA/DIF_MIN_REPLICA.csv");
  35.    print LECTURA $fecha." ; ".$var." ; OK \n";
  36.    close(LECTURA);
  37.  }
  38.  else
  39.  {
  40.    open(LECTURA,">>/LOG/ARGENTINA/DIF_MIN_REPLICA.csv");
  41.    print LECTURA $fecha." ; NULL ; CRITICAL \n";
  42.    close(LECTURA);
  43.  }
  44. }
  45.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
animal collective
Perlero nuevo
Perlero nuevo
 
Mensajes: 39
Registrado: 2010-10-17 17:53 @786
Ubicación: Chile

Publicidad

Re: Conexión a Oracle

Notapor explorer » 2012-01-10 15:26 @685

La forma profesional de hacerlo es usando DBI, pero tendrás que asegurarte que tienes instalado DBD::Oracle, y esto último es bastante complicado... si se hace a mano.

En las instalaciones Oracle, suele venir un directorio con un Perl propio, y con ese módulo ya compilado, así que entonces no hay que hacer ninguna instalación. Casi siempre ese Perl es muy viejo, pero para hacer consultas a la base de datos, es más que suficiente.

Según el propio README.win32.txt, la forma más cómoda es usando el PPM de ActiveState. O bajar las fuentes por el mismo medio y compilarlas (también comentado en el txt).

Presta atención a la combinación versión_de_tu_Perl / Sistema_operativo / versión_de_Oracle. No todas las combinaciones funcionan.

Si lo consigues, tendrás acceso a las centenares de funciones que DBI+DBD::Oracle te ofrecen, entre ellas, las que solicitas en tu pregunta.

Más información (en inglés) en la página Perl del Oracle Wiki.

Buena suerte...

(Después de todo esto, no me extraña que la gente prefiera usar MySQL o MariaDB o PostgreSQL)

En cuanto al código, se puede simplificar un poco.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!C:\Perl\bin\perl.exe
  2. # Transacciones
  3. use strict;
  4. use warnings;
  5. use MIME::Lite;
  6. use POSIX 'strftime';
  7.  
  8. my $fecha   = strftime "%d-%m-%Y %H:%M:%S", localtime;
  9. my $valor   = 0 + qx(sqlplus -S usuario/pass\@tnsname \@F:\\QRY/consulta.sql);
  10.  
  11. open(LECTURA, '>>/LOG/ARGENTINA/DIF_MIN_REPLICA.csv');
  12.  
  13. if ($valor >= 12) {
  14.     my $message = MIME::Lite->new(
  15.         From    => '[email protected]',
  16.         To      => '[email protected]',
  17.         Subject => 'DIF MIN REPLICA',
  18.         Data    => "Minutos de desfase entre hora actual y hora de ultima transacción en réplica: $var minutos",
  19.     );
  20.  
  21.     MIME::Lite->send('smtp', 'server_correo', Timeout => 60);
  22.     $message->send();
  23.  
  24.     print LECTURA "$fecha ; $valor ; CRITICAL \n";
  25. }
  26. else {
  27.    print LECTURA "$fecha ; $valor ; OK \n";
  28. }
  29.  
  30. close(LECTURA);
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 Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron