Выполнить хранимую процедуру DBI Perl - PullRequest
0 голосов
/ 27 августа 2018

Мне нужно использовать хранимую процедуру для сбора некоторых данных из базы данных, и для этого мне был предоставлен SQL-код:

declare @p3 xml
set @p3=convert(xml,N'<root><r i="XXXXXXXXXXXX"/></root>')
declare @p8 xml
set @p8=convert(xml,N'<root><r i="274"/><r i="276"/><r i="275"/><r i="155"/><r i="20"/><r i="520"/><r i="758"/><r i="760"/><r i="156"/><r i="172"/></root>')
exec spu_SearchItems @siteName=N'XXXXXXXXXXXX',@searchString=N'*',@searchLocations=@p3,@includeChildren=0,@includeSearchLocations=0,@includeExtensions=0,@maxResults=501,@classIds=@p8

Я заменил конфиденциальные данные на XXXXXXXXXXXX. Этот запрос работает при использовании в Microsoft SQL Management Studio и получает все, что мне нужно.

Моя проблема в том, что когда я выполняю этот же код в моем Perl-скрипте, он возвращает ссылку на хеш, что заставляет меня думать, что либо я не использую оператор SQL должным образом, либо я не могу «читать» информацию обратно.

Я использую это для настройки оператора sql:

sub newquery {

    my $sql = q(declare @p3 xml
        set @p3=convert(xml,N'<root><r i="XXXXXXXXXXXX"/></root>')
        declare @p8 xml
        set @p8=convert(xml,N'<root><r i="274"/><r i="276"/><r i="275"/><r i="155"/><r i="20"/><r i="520"/><r i="758"/><r i="760"/><r i="156"/><r i="172"/></root>')
        exec spu_SearchItems @siteName=N'XXXXXXXXXXXX',@searchString=N'*',@searchLocations=@p3,@includeChildren=0,@includeSearchLocations=0,@includeExtensions=0,@maxResults=501,@classIds=@p8);

    &dbMasterSub($sql);
}

и это для вызова в базу данных.

sub dbMasterSub() {

    my $sql = shift;
    my @row;

    # print $sql."\n";
    my $port = 1443;
    my $dsn  = "Provider=sqloledb;Trusted Connection=yes;";

    $dsn .= "Server=" . $myServer . ";Database=$myDB;";

    eval {
        my $dbh = DBI->connect( "dbi:ADO:$dsn", $myUser, $myPass, { RaiseError => 1, AutoCommit => 1 } );
        my $sth;

        if ( $sql eq "ping" ) {
            my $ping = $dbh->ping();
            return $ping;
        }
        else {
            $sth = $dbh->prepare( $sql );

            #Execute the statement
            $sth->execute();

            print "sth -> $sth\n";

            open( my $fh, '>:encoding(UTF-8)', $tagsPaths );
            print $fh "{\n";
            my $index = 0;

            while ( my $row = $sth->fetchrow_array() ) {

                print "$row" . "\n";

                if ( $index == 0 ) {
                    print $fh $row;
                    $index = $index + 1;
                }
                else {
                    print $fh ",\n" . $row;
                }
            }

            print $fh "\n}";
            close $fh;

            $sth->finish();
        }

        $dbh->disconnect();
    };
}

Кроме того, я попытался использовать fetchrow_hashref () вместо fetchrow_array (), но это не имеет никакого значения.

Надеюсь, вы сможете указать мне правильное направление. Спасибо.

РЕДАКТИРОВАТЬ: Я запустил запрос на MS SQL, и он возвращает 3 набора результатов. Мне нужен набор результатов 1, но я не знаю, как к нему добраться.

1 Ответ

0 голосов
/ 10 сентября 2018

Мне удалось выполнить итерацию и собрать все данные, возвращенные из хранимой процедуры, используя этот код:

$sth = $dbh->prepare($sql);
$sth->execute();
my $more_results;
my $count = 0;
my $tinyIndex = 0;
do{
    $count++;
    print "\n\tdataset $count\n";

    my $names = $sth ->{NAME};
    print join(";",@$names),"\n";
    while (my @row = $sth->fetchrow_array()){
        print join(";",@row),"\n";
        $tinyIndex++;
    }
    if ($@) {
        print "FAILED\n$@";
    }
    print "$tinyIndex rows\n";
}while($more_results = $sth->more_results);

- переменная $ sql, которая содержит саму процедуру.

...