执行存储过程 DBI Perl



我需要使用存储过程从数据库中收集一些数据,为此,我得到了一个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

我已将敏感数据替换为 XXXXXXXXXXXXX。此查询在 SQL 管理工作室中使用时有效Microsoft它获取我需要的所有内容。

我的问题是,当我在我的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 -> $sthn";
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 是我需要的,但不知道如何获得它。

我设法能够使用以下代码迭代和收集从存储过程返回的所有数据:

$sth = $dbh->prepare($sql);
$sth->execute();
my $more_results;
my $count = 0;
my $tinyIndex = 0;
do{
$count++;
print "ntdataset $countn";
my $names = $sth ->{NAME};
print join(";",@$names),"n";
while (my @row = $sth->fetchrow_array()){
print join(";",@row),"n";
$tinyIndex++;
}
if ($@) {
print "FAILEDn$@";
}
print "$tinyIndex rowsn";
}while($more_results = $sth->more_results);

$sql保存过程本身的变量。

最新更新