Как вызвать хранимые процедуры MySQL из Perl?

Как вызвать хранимые процедуры MySQL из Perl? Функциональность хранимых процедур является довольно новой для MySQL, и модули MySQL для Perl, похоже, еще не догнали ее.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
6
0
19 580
5

Ответы 5

Прежде всего вам, вероятно, следует подключиться через библиотеку DBI, а затем вы должны использовать переменные связывания. Например. что-то вроде:

#!/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();

Имейте в виду, что я это не тестировал, вам придется искать точный синтаксис на CPAN.

Вы забыли точку с запятой после eval {}. Это обычная ошибка.

Leon Timmermans 15.09.2008 20:18

Хранимые процедуры MySQL, которые создают наборы данных, требуют от вас использования Perl DBD :: mysql 4.001 или более поздней версии. (http://www.perlmonks.org/?node_id=609098)

Ниже представлена ​​тестовая программа, которая будет работать в более новой версии:

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)'

Но если у вас слишком старая версия DBD :: mysql, вы получите следующие результаты:

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

Вы можете установить последнюю версию DBD с помощью CPAN.

#!/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";

Мне потребовалось время, чтобы понять это, но я смог получить то, что мне нужно, с помощью вышеупомянутого. если вам нужно получить несколько "строк" возврата, я думаю, вы просто ...

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

Я надеюсь, что это помогает.

Привет, аналогично предыдущему, но с использованием SQL exec. Я не мог заставить работать команду CALL. Вам нужно будет заполнить все, что находится в квадратных скобках, и удалить квадратные скобки.

   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";

Другие вопросы по теме