2017-02-03 7 views
1

Perlでストアドプロシージャを実行しようとすると、いくつかのエラーが発生します。perl:selectを使用するストアドプロシージャを実行する

Select alpha.beta.get_something(alpha.STRING_ARRAY('xyz')) from tableName 

期待これは、DBAの連中から私たちに与えられた出力を生成して

次の文はのsqldeveloperで正常に動作して返す予想される結果

EXEC alpha.beta.do_something() 

これは、任意の出力を生成しません。 。これはDB用語でこの形式を持っています:Output Type:Ref Cursor。カーソルには2つのカラムがあります。ab

2つ目の文を実行するとエラーが発生します。

これは私が使用していますPerlのコードです:

sub execute_procedure { 
    my $dbh  = shift; 
    my $procedure = shift; 

    my $statement = "BEGIN $procedure; END;" 
    my $sth; 
    eval {$sth = $dbh->prepare($statement);}; 
    eval {$sth->execute();}; 

    if ([email protected]) { 
     print "failed"; 
    } else { 
     print "passed"; 
    } 
} 

# Call 1 
execute_procedure($dbh, "alpha.beta.do_something()") 

# Call 2 
execute_procedure($dbh, "Select alpha.beta.get_something(alpha.STRING_ARRAY('xyz')) from tableName") 

コール1つの作品予想通り、すべてのエラーを生成しません

コールこのエラーで2つの結果

"Select alpha.beta.get_something(alpha.STRING_ARRAY('xyz')) from tableName" results in :PLS-00428: an INTO clause is expected in this SELECT statement (DBD ERROR: error possibly near <> indicator at char 6 in 'BEGIN <>Select alpha.beta.get_result(alpha.STRING_ARRAY('xyz')) from tableName; END;')

場合私はBEGINとENDを次のようにexecute_procedure関数の文から削除します:

# my $statement = "BEGIN $procedure; END;"; 
my $statement = "$procedure"; 

それはすべてのエラーを生成しませんが、それは私が

my $result = $sth->fetchrow_hashref; 
print Dumper($result) 

結果解析する方法がわからない結果を返しますので、

$VAR1 = { 
    'alpha.beta.get_result(alpha.STRING_ARRAY(\'xyz\'))' => bless({}, 'DBI::st') 
}; 

を、私の質問は

ある
  1. SELECTステートメントを使用するストアドプロシージャを実行する正しい方法は何ですか? BEGIN $procedure; END;で呼び出すか、BEGIN/ENDを使用しないで呼び出す必要がありますか?

  2. bless({}, 'DBI::st')から実際のデータを取得するにはどうすればよいですか?私は別のフェッチオプションを使用することを試みた:fetchrowfetchrow_hashrefなどが、私はここでの値はa DBI statement handleあるオブジェクト

+0

これは非常によく知られています。ここ数日のうちに同じことを既に尋ねましたか? – simbabque

+1

はい、私はこれを昨日尋ねましたが、詳細が不足していて、人々からコードを提供するように頼まれました。私はちょうど他の質問を更新し、それをすぐに削除する予定です – comatose

+1

さて、それは非常に明確です。私の答えを見てください。 – simbabque

答えて

1
$VAR1 = { 'alpha.beta.get_result(alpha.STRING_ARRAY(\'xyz\'))' => bless({}, 'DBI::st') }; 

から実際のデータを取得することはできませんよ。 my $sth = $dbh->prepare(...)のときと同じことです。おそらくすでに実行されているので、フェッチメソッドを呼び出すことができます。

my $result = $sth->fetchrow_hashref; 
while (
    my $res = $result->{'alpha.beta.get_result(alpha.STRING_ARRAY(\'xyz\'))'} 
     ->fetchrow_hashref 
) { 
    # ... 
} 

しかし、それは恐ろしいように見えますが、キーが何であるかわからないことがあります。だから、あなたはすべてを繰り返し処理したいかもしれません。

my $result = $sth->fetchrow_hashref; 
foreach my $key (keys %${ $result }) { 
    print "Processing results of $key\n"; 
    while (my $res = $result->{$key}->fetchrow_hashref) { 
     # do things with the $res 

    } 
} 

結果を処理するには良い方法を見つけ出す必要があります。上記のループは、ハッシュ・リファレンスにただ1つのキーがある場合にも機能します。したがって、ちょうどそれを使用して、ちょうど1つしかないことを願ってください。

+0

それは動作します、ありがとう!だから、何かを返すストアドプロシージャについては、質問(1)を明確にするために、 "BEGIN $ procedure; END;"のように実行してください。いいアイデアではない? – comatose

+0

@comatoseわからない。以前はその構文を使用していませんでした。 – simbabque

関連する問題