Ich versuche, eine gespeicherte Prozedur mit mehreren Ein- und Ausgangsparametern auszuführen. Der Vorgang kann nur in meinem Bereich "Verbindungen" angezeigt werden, indem Sie unter "Andere Benutzer" navigieren | Pakete | |
Wenn ich mit der rechten Maustaste klicke, lauten die Menüpunkte "Mitglieder sortieren nach ..." und "Unit-Test erstellen" (ausgegraut). Die Möglichkeit, die Prozedur auszuführen, scheint nicht möglich zu sein, wenn der Benutzer darauf zugreift.
Ich habe versucht, ein Beispiel für das Erstellen eines anonymen Blocks zu finden, damit ich die Prozedur als SQL-Datei ausführen kann, habe aber nichts gefunden, was funktioniert.
Weiß jemand, wie ich diese Prozedur von SQL Developer ausführen kann? Ich verwende Version 2.1.1.64.
Danke im Voraus!
EDIT 1:
Die Prozedur, die ich aufrufen möchte, hat diese Signatur:
user.package.procedure(
p_1 IN NUMBER,
p_2 IN NUMBER,
p_3 OUT VARCHAR2,
p_4 OUT VARCHAR2,
p_5 OUT VARCHAR2,
p_6 OUT NUMBER)
Wenn ich meinen anonymen Block so schreibe:
DECLARE
out1 VARCHAR2(100);
out2 VARCHAR2(100);
out3 VARCHAR2(100);
out4 NUMBER(100);
BEGIN
EXECUTE user.package.procedure (33,89, :out1, :out2, :out3, :out4);
END;
Ich bekomme den Fehler:
Bind Varialbe "out1" is NOT DECLCARED
anonymous block completed
Ich habe versucht, die out * -Variablen zu initialisieren:
out1 VARCHAR2(100) := '';
aber bekomme den gleichen Fehler:
EDIT 2:
Basierend auf Alex 'Antwort habe ich versucht, die Doppelpunkte vor den Params zu entfernen und Folgendes zu erhalten:
Error starting at line 1 in command:
DECLARE
out1 VARCHAR2(100);
out2 VARCHAR2(100);
out3 VARCHAR2(100);
out4 NUMBER(100);
BEGIN
EXECUTE user.package.procedure (33,89, out1, out2, out3, out4);
END;
Error report:
ORA-06550: line 13, column 17:
PLS-00103: Encountered the symbol "USER" when expecting one of the following:
:= . ( @ % ; immediate
The symbol ":=" was substituted for "USER" to continue.
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
execute
; in PL / SQL wird dies als Start von interpretiertexecute immediate
, was sich von SQL unterscheidetexecute
.execute
. Dasdeclare
sollte vor dem seinbegin
. Ich denke, @OMG bedeutete, dass Sie die Variablen in SQL Developer vor dem anonymen Block mit demvariable
Schlüsselwort deklarieren und dann die:out1
Syntax verwenden können, wie Sie sie ursprünglich hatten. In diesem Fall haben Sie überhaupt keinendeclare
Abschnitt. Aber Sie verwechseln die beiden aus Ihrem letzten Kommentar.Antworten:
Mit einfachen Parametertypen (dh nicht Refcursoren usw.) können Sie Folgendes tun:
SET serveroutput on; DECLARE InParam1 number; InParam2 number; OutParam1 varchar2(100); OutParam2 varchar2(100); OutParam3 varchar2(100); OutParam4 number; BEGIN /* Assign values to IN parameters */ InParam1 := 33; InParam2 := 89; /* Call procedure within package, identifying schema if necessary */ schema.package.procedure(InParam1, InParam2, OutParam1, OutParam2, OutParam3, OutParam4); /* Display OUT parameters */ dbms_output.put_line('OutParam1: ' || OutParam1); dbms_output.put_line('OutParam2: ' || OutParam2); dbms_output.put_line('OutParam3: ' || OutParam3); dbms_output.put_line('OutParam4: ' || OutParam4); END; /
Bearbeitet , um die Spezifikation des OP zu verwenden, und mit einem alternativen Ansatz, um
:var
Bindungsvariablen zu verwenden :var InParam1 number; var InParam2 number; var OutParam1 varchar2(100); var OutParam2 varchar2(100); var OutParam3 varchar2(100); var OutParam4 number; BEGIN /* Assign values to IN parameters */ :InParam1 := 33; :InParam2 := 89; /* Call procedure within package, identifying schema if necessary */ schema.package.procedure(:InParam1, :InParam2, :OutParam1, :OutParam2, :OutParam3, :OutParam4); END; / -- Display OUT parameters print :OutParam1; print :OutParam2; print :OutParam3; print :OutParam4;
quelle
:var
Weg ändert . Ich würde dendeclare
Weg standardmäßig verwenden, wenn ich etwas mit PL / SQL machen würde; Aber ich könnte es verwenden,:var
wenn ich beispielsweise ein bisschen vorhandenen Code aus Pro * C kopiere, der bereits diese Syntax hat, und ich wollte die Parameter im Aufruf nicht berühren.:
(tatsächlich funktionierte es nicht damit).Einfach ausführen. Es kann schwierig sein, die Ergebnisse zu erhalten.
Schauen Sie sich diese Frage an, die ich am besten gestellt habe, um die Ergebnisse eines Oracle-Paketverfahrens zu erhalten
Die Zusammenfassung geht so.
Angenommen, Sie hatten ein Paket mit dem Namen mypackage und eine Prozedur namens getQuestions. Es gibt einen Refcursor zurück und nimmt den Benutzernamen der Zeichenfolge auf.
Sie müssen lediglich eine neue SQL-Datei erstellen (Datei neu). Stellen Sie die Verbindung ein und fügen Sie Folgendes ein und führen Sie es aus.
quelle
Für diejenigen, die SqlDeveloper 3+ verwenden, falls Sie dies verpasst haben:
SqlDeveloper verfügt über eine Funktion zum direkten Ausführen gespeicherter Prozesse / Funktionen, und die Ausgabe wird auf einfach zu lesende Weise angezeigt.
Klicken Sie einfach mit der rechten Maustaste auf das Paket / gespeicherte Prozedur / gespeicherte Funktion. Klicken Sie auf
Run
und wählentarget
Sie die Prozedur / Funktion aus, die Sie ausführen möchten. SqlDeveloper generiert das auszuführende Code-Snippet (damit Sie Ihre Eingabeparameter eingeben können). Nach der Ausführung werden die Ausgabeparameter in der unteren Hälfte des Dialogfelds angezeigt und es wird sogar der Ref-Cursor integriert: Das Ergebnis des Cursors wird als separate Ausgabe-Registerkarte angezeigt.quelle
Öffnen Sie die Prozedur in SQL Developer und führen Sie sie von dort aus. SQL Developer zeigt das ausgeführte SQL an.
BEGIN PROCEEDURE_NAME_HERE(); END;
quelle
Verwenden:
BEGIN PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...); END;
Ersetzen Sie "PACKAGE_NAME", "PROCEDURE_NAME" und "parameter_value" durch das, was Sie benötigen. OUT-Parameter müssen vorher deklariert werden.
quelle
Obwohl diese Frage ziemlich alt ist, stolpere ich immer wieder über das gleiche Ergebnis, ohne einen einfachen Weg zu finden, um von einem SQL-Entwickler ausgeführt zu werden. Nach einigen Versuchen fand ich eine einfache Möglichkeit, die gespeicherte Prozedur vom SQL-Entwickler selbst auszuführen.
Wählen Sie unter Pakete das gewünschte Paket aus und klicken Sie mit der rechten Maustaste auf den Paketnamen (nicht auf den Namen der gespeicherten Prozedur).
Sie finden eine Option zum Ausführen. Wählen Sie das aus und geben Sie die erforderlichen Argumente an. Klicken Sie auf OK und Sie können die Ausgabe im Abschnitt Ausgabevariablen unten sehen
Ich verwende SQL Developer Version 4.1.3.20
quelle
Keine dieser anderen Antworten hat bei mir funktioniert. Folgendes musste ich tun, um eine Prozedur in SQL Developer 3.2.20.10 auszuführen:
SET serveroutput on; DECLARE testvar varchar(100); BEGIN testvar := 'dude'; schema.MY_PROC(testvar); dbms_output.enable; dbms_output.put_line(testvar); END;
Und dann müssten Sie in der Tabelle nachsehen, was Ihr Proc mit dieser übergebenen Variablen tun sollte - die Ausgabe bestätigt nur, dass die Variable den Wert erhalten hat (und theoretisch an den Proc übergeben hat).
HINWEIS (Unterschiede zu meinen gegenüber anderen):
:
vor dem Variablennamen.package.
oder.packages.
zwischen dem Schemanamen und dem Prozedurnamen&
den Wert der Variablen nicht eingeben.print
überallvar
zum Deklarieren der VariablenAll diese Probleme ließen mich am längsten am Kopf kratzen und diese Antworten, die diese ungeheuren Fehler haben, müssen herausgenommen und geteert und gefiedert werden.
quelle
Ich kann nicht glauben, dass dies in SQL Developer nicht ausgeführt wird:
ABER das wird:
Natürlich muss alles in einer Zeile stehen.
quelle
execute
Befehl] wird dies angegeben. Dies ist jedoch keine Antwort auf die gestellte Frage und wurde bereits zuvor in relevanteren Antworten auf andere Fragen behandelt .Mit SQL Developer Version 4.0.2.15 Build 15.21 funktioniert Folgendes:
SET SERVEROUTPUT ON var InParam1 varchar2(100) var InParam2 varchar2(100) var InParam3 varchar2(100) var OutParam1 varchar2(100) BEGIN /* Assign values to IN parameters */ :InParam1 := 'one'; :InParam2 := 'two'; :InParam3 := 'three'; /* Call procedure within package, identifying schema if necessary */ schema.package.procedure(:InParam1, :InParam2, :InParam3, :OutParam1); dbms_output.enable; dbms_output.put_line('OutParam1: ' || :OutParam1); END; /
quelle
var
bevor die Variablen NICHT funktionieren - zumindest in SQL Developer 3.2.20.10, und sollte keine Doppelpunkte vor ihnen verwenden - keine Notwendigkeit, zumindest in 3.2.20.10 (nur Grund, warum ich es nicht getan habe) nicht abstimmen oder bearbeiten). Auch würde ein Semikolon danach brauchenSET SERVEROUTPUT ON
.Führen Sie den folgenden Befehl aus, um die Prozedur nur von SQL-Entwicklern auszuführen
EXECUTE PROCEDURE_NAME;
quelle
Ich konnte die Antworten von @Alex Poole nicht zum Laufen bringen. Durch Versuch und Irrtum fand ich jedoch die folgenden Arbeiten (unter Verwendung von SQL Developer Version 3.0.04). Hier posten, falls es anderen hilft:
SET serveroutput on; DECLARE var InParam1 number; var InParam2 number; var OutParam1 varchar2(100); var OutParam2 varchar2(100); var OutParam3 varchar2(100); var OutParam4 number; BEGIN /* Assign values to IN parameters */ InParam1 := 33; InParam2 := 89; /* Call procedure within package, identifying schema if necessary */ schema.package.procedure(InParam1, InParam2, OutParam1, OutParam2, OutParam3, OutParam4); /* Display OUT parameters */ dbms_output.put_line('OutParam1: ' || OutParam1); dbms_output.put_line('OutParam2: ' || OutParam2); dbms_output.put_line('OutParam3: ' || OutParam3); dbms_output.put_line('OutParam4: ' || OutParam4); END;
quelle
var
jeder Variablen imdeclare
Block eine ungültige hinzugefügt haben . Wenn Sie versuchen, dies auszuführen, erhalten Sie 'PLS-00103: Beim Erwarten einer der folgenden ...' das Symbol "NUMBER" und ähnliche Fehler für die anderen fünf Variablen.var
, und ich musste es nicht.package.
in meinem Anruf verwenden, zumindest in 3.2.20.10, was nicht so anders sein sollte, und bekam Fehler, als ich es tat. Verschwendete viel Zeit mit dieser Antwort.--for setting buffer size needed most of time to avoid `anonymous block completed` message set serveroutput on size 30000; -- declaration block in case output need to catch DECLARE --declaration for in and out parameter V_OUT_1 NUMBER; V_OUT_2 VARCHAR2(200); BEGIN --your stored procedure name schema.package.procedure( --declaration for in and out parameter V_OUT_1 => V_OUT_1, V_OUT_2 => V_OUT_2 ); V_OUT_1 := V_OUT_1; V_OUT_2 := V_OUT_2; -- console output, no need to open DBMS OUTPUT seperatly -- also no need to print each output on seperat line DBMS_OUTPUT.PUT_LINE('Ouput => ' || V_OUT_1 || ': ' || V_OUT_2); END;
quelle
Das Erstellen eines Pl / SQL-Blocks kann schmerzhaft sein, wenn Sie viele Prozeduren mit vielen Parametern haben. Es gibt eine auf Python geschriebene Anwendung , die dies für Sie erledigt. Es analysiert die Datei mit Prozedurdeklarationen und erstellt die Web-App für bequeme Prozeduraufrufe.
quelle
var out_para_name refcursor; execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name); print :out_para_name;
quelle