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つのカラムがあります。a
とb
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')
};
を、私の質問は
あるSELECTステートメントを使用するストアドプロシージャを実行する正しい方法は何ですか?
BEGIN $procedure; END;
で呼び出すか、BEGIN
/END
を使用しないで呼び出す必要がありますか?bless({}, 'DBI::st')
から実際のデータを取得するにはどうすればよいですか?私は別のフェッチオプションを使用することを試みた:fetchrow
、fetchrow_hashref
などが、私はここでの値はa DBI statement handleあるオブジェクト
これは非常によく知られています。ここ数日のうちに同じことを既に尋ねましたか? – simbabque
はい、私はこれを昨日尋ねましたが、詳細が不足していて、人々からコードを提供するように頼まれました。私はちょうど他の質問を更新し、それをすぐに削除する予定です – comatose
さて、それは非常に明確です。私の答えを見てください。 – simbabque