Gespeicherte Prozedur in SQL Developer ausführen?


79

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:


Versuchen Sie, die OUT-Variablen vor der Prozedurausführungsanweisung in BEGIN einzufügen.
OMG Ponys

Du brauchst das nicht execute; in PL / SQL wird dies als Start von interpretiert execute immediate, was sich von SQL unterscheidet execute.
Alex Poole

2
@sdoca: Sie verwechseln jetzt zwei Ansätze; Entfernen Sie mit Ihrer Edit 2-Version einfach das Wort execute. Das declaresollte vor dem seinbegin . Ich denke, @OMG bedeutete, dass Sie die Variablen in SQL Developer vor dem anonymen Block mit dem variableSchlüsselwort deklarieren und dann die :out1Syntax verwenden können, wie Sie sie ursprünglich hatten. In diesem Fall haben Sie überhaupt keinen declareAbschnitt. Aber Sie verwechseln die beiden aus Ihrem letzten Kommentar.
Alex Poole

1
Ja, ich wusste, dass ich verwirrt war, war mir aber nicht ganz sicher, wo / wie.
SDoca

Antworten:


75

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 :varBindungsvariablen 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;

1
+1 nette Antwort. Wissen Sie aus Neugier, welche bevorzugt wird?
Conrad Frix

@ Conrad: Ich stelle mir vor, es ist eine Präferenzsache, obwohl es möglicherweise mehr Kontext gibt, der den :varWeg ändert . Ich würde den declareWeg standardmäßig verwenden, wenn ich etwas mit PL / SQL machen würde; Aber ich könnte es verwenden, :varwenn 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.
Alex Poole

2
Vielen Dank für die Hilfe und die ausführliche Antwort. Ich bin sicher, es wird auch anderen helfen. Zu beachten ist, dass diese als Skripte und nicht als Anweisungen ausgeführt werden müssen.
Sdoca

1
Bei der Ausführung in SQL Developer musste ich den Variablennamen kein Präfix voranstellen :(tatsächlich funktionierte es nicht damit).
Haridsv

28

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.

var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;

3
Ich musste das vollständige Wort "ausführen" anstelle von "ausführen" verwenden
Patrick

20

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 Runund wählen targetSie 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.


1
Dies sollte die ausgewählte Antwort sein.
EvilTeach

12

Ö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;

6

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.


2

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


1

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):

  • Nein :vor dem Variablennamen
  • Kein Putten .package.oder.packages. zwischen dem Schemanamen und dem Prozedurnamen
  • Sie müssen &den Wert der Variablen nicht eingeben.
  • Keine Verwendung von printüberall
  • Keine Verwendung varzum Deklarieren der Variablen

All 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.


0

Ich kann nicht glauben, dass dies in SQL Developer nicht ausgeführt wird:

var r refcursor;
exec PCK.SOME_SP(:r,
 '02619857');

print r;

ABER das wird:

var r refcursor;
exec TAPI_OVLASCENJA.ARH_SELECT_NAKON_PRESTANKA_REG(:r, '02619857');

print r;

Natürlich muss alles in einer Zeile stehen.


2
In den [SQL * Plus-Dokumenten für den executeBefehl] wird dies angegeben. Dies ist jedoch keine Antwort auf die gestellte Frage und wurde bereits zuvor in relevanteren Antworten auf andere Fragen behandelt .
Alex Poole

Konnte es in SQL Developer verwenden. Danke
Sergejs

0

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;
/

Nein, tut mir leid - varbevor 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 brauchen SET SERVEROUTPUT ON.
Vapcguy

0

Führen Sie den folgenden Befehl aus, um die Prozedur nur von SQL-Entwicklern auszuführen

EXECUTE PROCEDURE_NAME;


-1

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;

2
Dies entspricht der ersten Version in meiner Antwort, außer dass Sie varjeder Variablen im declareBlock 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.
Alex Poole

Ich stimme Alex zu. Downvoted, weil das 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.
Vapcguy

-1
--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;

-2

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.


-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.