3 Stimmen

Ausführen einer gespeicherten Prozedur in Oracle

Ich habe eine gespeicherte Prozedur, auf Toad für Oracle rufe ich die Prozedur auf

SELECT FROM PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7) 
  FROM DUAL

Auf dieser Prozedur habe ich auch 3 Ausgabeparameter, ich erhalte einen

ORA-00904: PKGName.ProcedureName : Ungültiger Bezeichner

Muss ich die Ausgabeparameter auch bei Aufruf der Prozedur angeben? Wenn ja, wie kann ich sie verwenden?

0 Stimmen

Ich denke, diese Frage passt auch zu oracleoverflow.com

1 Stimmen

Sie können keine Funktion mit Ausgabeparametern aus einer SQL-Anweisung aufrufen. Wie DCookie bereits erwähnt hat, können Sie keine Prozedur aufrufen. Es können nur Funktionen aufgerufen werden.

5voto

DCookie Punkte 41310

Sie können keine Prozedur in einer SELECT-Anweisung verwenden. Funktionen ja (mit entsprechenden Rückgabetypen), Prozeduren nein. Elemente in einer SELECT-Liste müssen Ausdrücke sein, die auf einen Wert aufgelöst werden müssen. Eine Prozedur erfüllt dieses Kriterium nicht.

Und ja, Sie müssen die Ausgabeparameter in Ihrer Parameterliste erwähnen. Die Prozedur wird diese Parameter auf bestimmte Werte setzen, daher muss für jeden ein Ausgabeparameter angegeben werden, um sie zu empfangen. @schurik zeigt Ihnen, wie dies normalerweise in PL/SQL gemacht wird. @Datajam ist nah dran, wie Sie es in SQL*Plus machen würden, lässt jedoch die Ausgabeparameter aus:

SQL> var num_var number
SQL> var txt_var varchar2(15)
SQL> var txt_var2 varchar2(20)

SQL> exec PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7, :num_var, :txt_var, :txt_var2);

PL/SQL-Prozedur wurde erfolgreich abgeschlossen
num_var
---------------
42
txt_var
-----------------
some text
txt_var2
-------------------
some other text

SQL>

2voto

schurik Punkte 7669
declare 
  -- Variablen deklarieren, um Ausgabewerte zu speichern
  output_par_1 varchar2(100);
  output_par_2 number(10);
  ...
begin
  PKGName.ProcedureName(1,'10/10/2010','10/23/2010',output_par_1,output_par_2);

  -- Ausgabewerte anzeigen
  dbms_output.put_line('output_par_1: ' || output_par_1);
  dbms_output.put_line('output_par_2: ' || output_par_2);
end;
/

1voto

Anthony Accioly Punkte 20616

Wenn Sie in der Lage sein möchten, Prozeduren aus einem SELECT-Aufruf aufzurufen, sollten Sie diese in eine Funktion oder Tabellenfunktion einbinden. Weitere Details finden Sie hier: http://technology.amis.nl/blog/1017/calling-stored-procedures-using-plain-sql-for-when-sql-is-allowed-but-calls-to-stored-procedures-are-not (hehehe, der Titel ist fast schon ein Artikel).

0voto

maple_shaft Punkte 10389

Ja, Sie müssen alle Argumente bereitstellen. Deklarieren Sie eine Variable des entsprechenden Typs und übergeben Sie sie als Ausgabeargument.

0voto

Datajam Punkte 4091

Sie sollten eine Prozedur wirklich nicht mit einer SELECT-Anweisung aufrufen (und selbst wenn Sie es täten, wäre der Aufruf vor dem FROM-Teil).

Verwenden Sie stattdessen eine SQL*Plus-Eingabeaufforderung (ich glaube, Toad hat eine integrierte SQL*Plus-Schnittstelle):

exec PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X