2011-01-04 5 views
0

Sollte die Reihenfolge der Parametertypen beim Aufruf einer gespeicherten Prozedur in Oracle wichtig sein?Gespeicherte Oracle-Prozeduren ... Probleme beim Setzen eines OUT-Parameters vor einem IN-Parameter?

Zum Beispiel

my_proc (
param_a IN NUMBER 
, param_b IN STRING 
, param_c OUT NUMBER 
, param_d OUT STRING 
) begin 
param_c = param_a 
param_d = param_b 
end 

Wenn wir etwas tun, wie die oben wir (die spezifische Syntax vergeben bitte wieder) in wieder heraus in den OUT-Parameter übergebenen Werte (bitte Syntaxfehler verzeihen). Erhalten die

Wenn wir jedoch param_c über param_b bewegen bekommen wir 0,0 und NULL anstelle der übergebenen Werte.

my_proc (
param_a IN NUMBER 
, param_c OUT NUMBER 
, param_b IN STRING 
, param_d OUT STRING 
) begin 
param_c = param_a 
param_d = param_b 
end 

Wir dies testen in PL/SQL.

Gibt es etwas, was wir übersehen?

Dank BayouBob

Antwort

0

Dank an alle, die dies berücksichtigt, aber es stellt sich heraus, etwas irgendwie einfach zu sein. Es scheint, dass die Art, wie Sie eine gespeicherte Prozedur über ojdbc6 aufrufen, einen großen Unterschied macht.

Ich sollte gestehen, dass dies ursprünglich eine Java/Oracle-Frage war, die wir mit PL/SQL zu bestätigen versuchten.

Wenn wir die gespeicherte Prozedur als 'call my_proc (...)' aufgerufen haben, scheint die Reihenfolge der IN- und OUT-Parameter wichtig zu sein; während 'begin my_proc (...) end' gut funktioniert.

Hinweis: Dies gilt für das Erstellen eines Callable Statement in Java 6 mit Ojdbc6.

+0

Verwenden Sie benannte oder positionelle Parameter? Benannte Elemente werden manchmal nicht so behandelt, wie Sie es erwarten, und werden als positional behandelt, was erklären könnte, was Sie gesehen haben. –

+0

Wir wechseln von positional zu named, um uns von den Launen des Clients abzukoppeln, der die Datenbank bereitstellt, mit der wir uns verbinden müssen. –

0

Sie können Ihre IN/OUT-Parameter in beliebiger Reihenfolge Sie definieren. Wie rufen Sie dieses Verfahren an? Wenn Sie eine leere Zeichenfolge übergeben, erhalten Sie einen NULL-Ausgabewert. Zum Beispiel:

declare 
    param_c NUMBER; 
    param_d VARCHAR2(100); 
begin 

    my_proc (
    0, 
    param_c, 
    '', 
    param_d 
); 

    dbms_output.put_line(param_c); 

    dbms_output.put_line(nvl(param_d, 'null')); 

end; 

Dies sollte Ausgabe:

0 
null 
Verwandte Themen