Как я могу получить несколько записей из запроса MySQL в Perl, используя указатели массива? - PullRequest
0 голосов
/ 16 ноября 2018

Я могу сделать все это как одну функцию, но при попытке перенести это на мои пакеты функций (библиотеки) я что-то упускаю.

Вот что я хочу сделать из своего основного сценария Perl

my @rows;
$result = Funx::dbcdata($myConnection, 
          "SELECT * FROM Inv where name like \"%DOG%\";", \@rows);

Затем в моем библиотечном пакете я пытаюсь это

sub dbcdata
{
    my ($connection, $command, $array) = @_;

    my $query = $connection->prepare($command);
    my $result = $query->execute();

    my $i =0;
    while(my $row = $query->fetchrow_arrayref() )
    {
    @{$array}[$i] = $row;
    $i++;
    }
    $query->finish;
    return $result;
}

Я надеялся получить указатели или ссылки на каждую строку (в данном случае это было 4), но это не так.Каждый элемент в @rows одинаков:

ARRAY (0x5577a0f77ec0) ARRAY (0x5577a0f77ec0) ARRAY (0x5577a0f77ec0) ARRAY (0x5577a0f77ec0)

Не знаю, как я знаюкаждый в оригинальном отдельном ряду.Любая помощь будет оценена, спасибо.

1 Ответ

0 голосов
/ 16 ноября 2018

С документация для fetchrow_arrayref:

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

Звучит так, как вы хотите fetchall_arrayref :

Метод fetchall_arrayref может использоваться для извлечения всех данных, которые должны быть возвращены из подготовленного и выполненного операторасправиться.Он возвращает ссылку на массив, который содержит одну ссылку на строку.

После выполнения оператора вы можете сделать что-то вроде

@{$array} = $query->fetchall_arrayref->@*;

вместо этого уродливого цикла.

Но selectall_array может быть даже лучше.Вся ваша функция может быть заменена вызовом:

my @rows =
     $myConnection->selectall_array(q/SELECT * FROM Inv WHERE name LIKE '%DOG%'/);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...