mysql - desde - llamar procedimiento almacenado hibernate
¿Cómo puedo llamar a los procedimientos almacenados de MySQL desde Perl? (5)
¿Cómo puedo llamar a los procedimientos almacenados de MySQL desde Perl? La funcionalidad del procedimiento almacenado es bastante nueva en MySQL y los módulos MySQL para Perl no parecen haberse puesto al día aún.
En primer lugar, probablemente debería conectarse a través de la biblioteca DBI y luego debería usar variables de vinculación. Por ejemplo, algo 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 ($@) {
warn "Database error: $DBI::errstr/n";
$dbh->rollback(); #just die if rollback is failing
}
$dbh->commit();
Ten en cuenta que no he probado esto, tendrás que buscar la sintaxis exacta en CPAN.
Los procedimientos almacenados de MySQL que producen datasets necesitan que use 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 nueva:
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 tienes una versión demasiado antigua de DBD :: mysql, obtienes 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 nuevo usando CPAN.
Hay un ejemplo en la sección Conjuntos de resultados múltiples en los documentos DBD :: mysql .
#!/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 darme cuenta, pero pude obtener lo que necesitaba con lo anterior. si necesita obtener múltiples "líneas" de retorno, supongo que solo ...
while(my $response = $sth->fetchrow_hashref()) {
print Dumper $response . "/n";
}
Espero que ayude.
Hola, similar al anterior pero usando 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";