Je rencontre des erreurs lors de l'exécution d'une procédure stockée via Perl.perl: exécution d'une procédure stockée qui utilise select
Les énoncés suivants fonctionnent très bien dans sqldeveloper et renvoient des résultats attendus
EXEC alpha.beta.do_something()
Cela ne génère pas de sortie, comme prévu
Select alpha.beta.get_something(alpha.STRING_ARRAY('xyz')) from tableName
Cela génère une sortie qui nous est donnée à des gars DBA . Il a ce format en termes de DB: Output Type:Ref Cursor
. Le curseur a deux colonnes, a
et b
Lors de l'exécution de Perl, j'obtiens des erreurs lors de l'exécution de la deuxième instruction.
Voici le code Perl que j'utilise:
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")
Appel 1 fonctionne comme prévu, ne génère pas d'erreurs
appel 2 résultats dans cette erreur
"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;')
si Je supprime BEGIN et END de la déclaration dans la fonction execute_procedure
comme ceci:
# my $statement = "BEGIN $procedure; END;";
my $statement = "$procedure";
alors il ne génère pas d'erreur, mais il renvoie un résultat que je ne sais pas comment analyser
my $result = $sth->fetchrow_hashref;
print Dumper($result)
résultats dans:
$VAR1 = {
'alpha.beta.get_result(alpha.STRING_ARRAY(\'xyz\'))' => bless({}, 'DBI::st')
};
donc, mes questions sont
Quelle est la bonne façon d'exécuter une procédure stockée qui utilise l'instruction SELECT? Doit-il être appelé avec
BEGIN $procedure; END;
ou sans leBEGIN
/END
?Comment puis-je obtenir les données réelles de
bless({}, 'DBI::st')
? Je l'ai essayé d'utiliser différentes options ira chercherfetchrow
,fetchrow_hashref
etc., mais je ne suis pas en mesure d'obtenir les données réelles de l'objet
Cela semble très familier. Avez-vous déjà demandé la même chose ces derniers jours? – simbabque
oui, je l'ai demandé hier, mais il manquait des détails et les gens m'ont demandé de fournir le code. Je viens de mettre à jour l'autre question et je l'enlèverai bientôt. – comatose
Eh bien maintenant c'est super clair. Vois ma réponse. – simbabque