2008-09-15 12 views

Respuesta

2

En primer lugar, probablemente debe conectarse a través de la biblioteca DBI y luego debe utilizar las variables de vinculación. P.ej. algo así como:

#!/usr/bin/perl 
# 
use strict; 
use DBI qw(:sql_types); 

my $dbh = DBI->connect(
      $ConnStr, 
      $User, 
      $Password, 
      {RaiseError => 1, AutoCommit => 0} 
     ) || die "Database connection not made: $DBI::errstr"; 
my $sql = qq {CALL someProcedure(1);} } 

my $sth = $dbh->prepare($sql); 
eval { 
    $sth->bind_param(1, $argument, SQL_VARCHAR); 
}; 
if ([email protected]) { 
warn "Database error: $DBI::errstr\n"; 
$dbh->rollback(); #just die if rollback is failing 
} 

$dbh->commit(); 

Recuerda que no he probado esto, tendrás que buscar la sintaxis exacta en CPAN.

+0

Olvidó el punto y coma después de eval {}. Es un error común. –

7

Los procedimientos almacenados de MySQL que producen conjuntos de datos necesitan que utilice Perl DBD :: mysql 4.001 o posterior. (http://www.perlmonks.org/?node_id=609098)

A continuación se muestra un programa de prueba que funcionará en la versión más reciente:

mysql> delimiter // 
mysql> create procedure Foo(x int) 
    -> begin 
    -> select x*2; 
    -> end 
    -> // 

perl -e 'use DBI; DBI->connect("dbi:mysql:database=bonk", "root", "")->prepare("call Foo(?)")->execute(21)' 

Pero si usted tiene una versión demasiado vieja de DBD :: mysql, obtener resultados como este:

DBD::mysql::st execute failed: PROCEDURE bonk.Foo can't return a result set in the given context at -e line 1. 

Puede instalar el DBD más reciente mediante CPAN.

2
#!/usr/bin/perl 
# Stored Proc - Multiple Values In, Multiple Out 
use strict; 
use Data::Dumper; 
use DBI; 
my $dbh = DBI->connect('DBI:mysql:RTPC;host=db.server.com', 
    'user','password',{ RaiseError => 1 }) || die "$!\n"; 
my $sth = $dbh->prepare('CALL storedProcedure(?,?,?,?,@a,@b);'); 
$sth->bind_param(1, 2); 
$sth->bind_param(2, 1003); 
$sth->bind_param(3, 5000); 
$sth->bind_param(4, 100); 
$sth->execute(); 
my $response = $sth->fetchrow_hashref(); 
print Dumper $response . "\n"; 

Me tomó un tiempo para averiguarlo, pero yo era capaz de conseguir lo que necesitaba con lo anterior. si usted necesita para obtener múltiples "líneas" de retorno Te estoy adivinando sólo ...

while(my $response = $sth->fetchrow_hashref()) { 
    print Dumper $response . "\n"; 
} 

espero que ayude.

1

Hola, similar a la anterior, pero utilizando el SQL Exec. No pude hacer que el comando CALL funcionara. Tendrá que completar todo lo que esté entre corchetes y eliminar los corchetes.

 
    use DBI; 
    #START: SET UP DATABASE AND CONNECT 
    my $host  = '*[server]*\\*[database]*'; 
    my $database = '*[table]*'; 
    my $user  = '*[user]*'; 
    my $auth  = '*[password]*'; 

    my $dsn = "dbi:ODBC:Driver={SQL Server};Server=$host;Database=$database"; 
    my $dbh = DBI->connect($dsn, $user, $auth, { RaiseError => 1 }); 

    #END : SET UP DATABASE AND CONNECT 
    $sql = "exec *[stored procedure name]* *[param1]*,*[param2]*,*[param3]*;"; 
    $sth = $dbh->prepare($sql); 
    $sth->execute or die "SQL Error: $DBI::errstr\n"; 
Cuestiones relacionadas