Moin Moin!
Hallo Alexander,
vielen Dank für Deinen Tipp. Ich habe das Programm jetzt wir folgt abgeändert, ich erhalte aber immer noch die gleiche Fehlermeldung:
Diese? "DBD::Oracle::st execute failed: ORA-06550: line 1, column 14:
PLS-00306: wrong number or types of arguments in call to 'MY_FUNC'"
Dann würde ich mal nachsehen, wie MY_FUNC definiert ist. Ganz offensichtlich hat Oracle mit der Anzahl oder dem Typ der Parameter ein Problem.
my $sth = $dbh->prepare("BEGIN :out := my_func(:p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9, :p10, :p11, :p12, :p13); END;") || exit 1;
${sth}->bind_param(":p1", $id);
${sth}->bind_param(":p2", undef);
${sth}->bind_param(":p3", undef);
${sth}->bind_param(":p4", undef);
${sth}->bind_param(":p5", undef);
${sth}->bind_param(":p6", undef);
${sth}->bind_param(":p7", undef);
${sth}->bind_param(":p8", undef);
${sth}->bind_param(":p9", undef);
${sth}->bind_param(":p10", $eingang);
${sth}->bind_param(":p11", $fehler);
${sth}->bind_param(":p12", undef);
${sth}->bind_param(":p13", undef);${sth}->bind_param_inout(":out", $out, 500);
${sth}->execute;
Das sieht auf den ersten Blick ok aus, soll heißen: 13 Parameter und bind_param_inout() für den Rückgabewert. ABER: Weil Du bei bind_param() keine expliziten Typangaben machst (dritter Parameter fehlt), wird DBI bzw. DBD::Oracle irgendeinen Default-Typ nehmen, bei DBD::Oracle ist das ohne weitere Einstellungen VARCHAR2.
Deine Oracle-Funktion hat aber auch noch einige NUMBER- und BLOB-Argumente, und ich schätze, dass Oracle keinen Bock hat, die VARCHAR2s automatisch umzuwandeln.
Ruf also bind_param() mit einem zum jeweiligen Parameter passenden Datentyp auf. Das ist in der Doku von DBD::Oracle ziemlich ausführlich beschrieben.
Übrigens ist dort auch noch eine Perle zum dritten Parameter von bind_param_inout() zu finden: >>The third parameter of bind_param_inout_array, (0 in the example), "maxlen" is required by DBI but not used by DBD::Oracle.<<
Wenn Du also nur mit Oracle arbeiten willst, kannst Du Dir das Größenraten komplett sparen, immer 0 nehmen, und Oracle / DBD::Oracle den Rest machen lassen.
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".