2010-11-18 35 views
5

Tenemos un script Perl que ejecuta un SQL y coloca datos en la tabla. Ahora, en lugar de suministrar una sola instrucción SQL, queremos pasar muchos de ellos juntos en un archivo .sql. Sabemos que nuestro programa fallará porque espera una sola instrucción SQL, no un montón de ellas (eso también de un archivo .sql). ¿Cómo hacemos que funcione con un archivo .sql (que tiene múltiples instrucciones INSERT?). Estamos usando el paquete DBI.Ejecutar archivo SQL en Perl

Un pequeño fragmento de código:

$sth = $dbh->prepare("/home/user1/tools/mytest.sql"); 
$sth->execute || warn "Couldn't execute statement"; 
$sth->finish(); 
+0

Vea también http://stackoverflow.com/questions/945584/is-it-possible-to-execute-multiple-statements-in-a-single-query-using-dbdoracle http://stackoverflow.com/ preguntas/1232950/perl-dbi-run-sql-script-with-multiple-statements – daxim

Respuesta

4
No

exactamente seguro de lo que quiere ...

Una vez que se crea un objeto DBI, se puede Úselo una y otra vez. Aquí estoy leyendo instrucción SQL después de la instrucción SQL de un archivo y procesamiento de todos y cada uno en orden:

use DBI; 

my $sqlFile = "/home/user1/tools/mytest.sql" 

my $dbh = DBI::Connect->new($connect, $user, $password) 
    or die("Can't access db"); 

# Open the file that contains the various SQL statements 
# Assuming one SQL statement per line 

open (SQL, "$sqlFile") 
    or die("Can't open file $sqlFile for reading"); 

# Loop though the SQL file and execute each and every one. 
while (my $sqlStatement = <SQL>) { 
    $sth = dbi->prepare($sqlStatement) 
     or die("Can't prepare $sqlStatement"); 

    $sth->execute() 
     or die("Can't execute $sqlStatement"); 
} 

en cuenta que estoy poniendo la instrucción SQL en el nombre del archivo y no prepare que contiene el SQL declaración. ¿Podria ese ser tu problema?

+0

aquí estoy llamando al archivo dq.sql en el script perl en el que estoy pasando variables como $ patch_name, $ svn_url, $ ftp_path que está definido en el archivo perl pero el archivo db.sql no está accediendo a esa variable? pls me ayude lo antes posible. $ sqlfile = "C: /BuildScript/YellowBox_Script/YellowBox_Core_Script/db.sql"; abierto (SQL, "$ sqlfile") o die ("No se puede abrir el archivo $ sqlFile para la lectura"); while ($ SqlStatement = ) { $ sth = $ dbh-> preparar ($ SqlStatement) o morir ("No se puede preparar $ SqlStatement"); $ sth-> execute() o die ("No se puede ejecutar $ sqlStatement"); } ' – picnic4u

+1

@ picnic4u: ¿Puedes crear una pregunta en lugar de un comentario? Otros lo verán y pueden ayudarte. –

+0

A menos que me falta algo, esto supone una afirmación por línea, lo cual no está garantizado. –

4

No es necesario Perl para esto en absoluto. Sólo tiene que utilizar el cliente de línea de comandos mysql:

mysql -h [hostname] -u[username] -p[password] [database name] < /home/user1/tools/mytest.sql

reemplazar las variables de [] con su información.

Nota sin espacio después de -u o -p. Si el servidor MySQL se está ejecutando en la misma máquina se puede omitir -h [host] (el valor predeterminado es localhost)

+0

Hola Cfreak, en realidad es una secuencia de comandos que no incluye otras cosas, por lo que necesitamos la modificación de este script. Gracias por la solución sin embargo. – t0mcat

0

Así es como lo he hecho. En mi caso, no asumo un SQL por línea y supongo que mi ejemplo es un poco mejor :)

sub get_sql_from_file { 
    open my $fh, '<', shift or die "Can't open SQL File for reading: $!"; 
    local $/; 
    return <$fh>; 
}; 

my $SQL = get_sql_from_file("SQL/file_which_holds_sql_statements.sql"); 
my $sth1 = $dbh1->prepare($SQL); 
$sth1->execute(); 
+1

¿Por qué 'get_sql_from_file' no devolvería el SQL, en lugar de establecer una variable global? Las variables globales son malas –

+0

Podría devolver el SQL, pero ¿por qué crees que usar la variable $ SQL es malo en ese ejemplo? ¿Puedes explicarlo? ¿Quiso decir que el uso de variables globales es una mala idea en general? –

+1

Las variables globales son, en general, una mala idea. Tus funciones serán más fáciles de reutilizar si son autónomas y no asumen la existencia de variables externas. –

3

Hay una especie de solución para DDL. Primero debe sorber el archivo SQL y luego incluir su contenido en BEGIN ... END; palabras clave. Al igual que:

sub exec_sql_file { 
    my ($dbh, $file) = @_; 

    my $sql = do { 
     open my $fh, '<', $file or die "Can't open $file: $!"; 
     local $/; 
     <$fh> 
    }; 

    $dbh->do("BEGIN $sql END;"); 
} 

Esta subrutina permite ejecutar DDL (SQL) scripts con múltiples sentencias dentro de la base de datos (por ejemplo, vertederos).

Cuestiones relacionadas