2010-10-21 11 views
60

Ich versuche eine gespeicherte Prozedur auszuführen, die mehrere ein- und ausgehende Parameter hat. Das Verfahren kann nur in meinem Verbindungsbedienfeld durch Navigieren in Andere Benutzer | angezeigt werden | Pakete | |Gespeicherte Prozedur in SQL Developer ausführen?

Wenn ich mit der rechten Maustaste klicke, sind die Menüpunkte "Order Members By ..." und "Create Unit Test" (ausgegraut). Die Möglichkeit, die Prozedur "zu starten", scheint nicht möglich zu sein, wenn der Benutzer darauf zugreift.

Ich habe versucht, ein Beispiel für die Erstellung eines anonymen Blocks zu finden, so dass ich die Prozedur als SQL-Datei ausführen kann, aber nichts gefunden habe, das funktioniert.

Weiß jemand, wie ich diese Prozedur von SQL Developer ausführen kann? Ich benutze Version 2.1.1.64.

Vielen Dank im Voraus!

EDIT 1:

Das Verfahren ich anrufen will hat diese Unterschrift:

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 meine anonymen Block wie folgt schreiben:

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; 

erhalte ich die Fehler :

Bind Varialbe "out1" is NOT DECLCARED 
anonymous block completed 

Ich habe versucht, die aus * Variablen initialisiert:

out1 VARCHAR2(100) := ''; 

aber bekommen den gleichen Fehler:

EDIT 2:

Basierend auf Alex 'Antwort, habe ich versucht, die Doppelpunkte Entfernen von vor dem params und erhalten Sie diese:

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: 
+0

mögliche Duplikate von [Der beste Weg/Werkzeug, um die Ergebnisse aus einem Oracle-Paket-Verfahren zu erhalten] (http://stackoverflow.com/questions/3526798/best-way-tool-to-get-the-results-from- an-oracle-package-procedure) –

+0

Versuchen Sie, die OUT-Variablen in BEGIN zu setzen, bevor Sie die Prozedur ausführen. –

+0

Sie brauchen nicht das 'execute'; in PL/SQL, das als Start von 'execute direkt' interpretiert wird, was sich von SQL 'execute' unterscheidet. –

Antwort

63

Mit einfachen Parametertypen (d. H. Keine Refcursors usw.)) Können Sie etwas 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; 
/


Herausgegeben der OPs spec, und mit einem alternativen Ansatz verwenden :var Bind-Variablen 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. Aus Neugier wissen Sie, welche bevorzugt wird? –

+0

@Conrad: Ich kann mir vorstellen, es ist ein Vorzugssache, obwohl es mehr Kontext geben könnte, der den ': var' Weg umschaltet. Ich würde den 'declare'-Weg standardmäßig verwenden, wenn ich irgendetwas mit PL/SQL mache; aber ich könnte '' var' verwenden, wenn ich zum Beispiel einen Teil des vorhandenen Codes verwende, der von Pro * C kopiert wurde, der diese Syntax bereits hatte, und ich wollte die parms im Aufruf nicht berühren. –

+1

Danke für die Hilfe und die ausführliche Antwort. Ich bin mir sicher, dass es auch anderen eine Hilfe sein wird. Eine Sache zu beachten ist, dass diese als Skripte nicht als Anweisungen ausgeführt werden müssen. – sdoca

23

Ausführen einfach. Die Ergebnisse können schwierig sein.

Werfen Sie einen Blick auf diese Frage, die ich Best way/tool to get the results from an oracle package procedure

Die Zusammenfassung der es so geht gefragt.

Angenommen, Sie hatten ein Paket namens mypackage und Prozedur getQuestions genannt. Es gibt einen Refcursor zurück und nimmt den String-Benutzernamen an.

Alles, was Sie tun müssen, ist eine neue SQL-Datei (Datei neu) zu erstellen. Stellen Sie die Verbindung ein und fügen Sie sie ein und führen Sie sie aus.

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

Ich musste das ganze Wort "execute" statt "exec" verwenden – Patrick

4

Verwendung:

BEGIN 

    PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...); 

END; 

Ersetzen "PACKAGE_NAME", "PROCEDURE_NAME" und "parameter_value" mit dem, was Sie brauchen. OUT-Parameter müssen vorher deklariert werden.

7

Öffnen Sie die Prozedur in SQL Developer und führe es von dort aus. SQL Developer zeigt das SQL an, das ausgeführt wird.

BEGIN 
    PROCEEDURE_NAME_HERE(); 
END; 
-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name); 
print :out_para_name; 
0

kann nicht glauben, das ist nicht in SQL Developer ausgeführt wird:

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

print r; 

aber dies wird:

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

print r; 

Offensichtlich alles in einer Zeile sein muss ..

+2

Die [SQL * Plus-Dokumentation für den Befehl 'execute'] besagt, dass. Dies ist jedoch keine Antwort auf die Frage, die bereits gestellt wurde (und in anderen relevanten Fragen beantwortet wurde) (http://stackoverflow.com/a/15649958/266304). –

+0

Konnte es in SQL Developer verwenden. Danke – Sergejs

-1

Ich konnte @Alex Poole nicht bekommen nswer arbeitet. Durch Versuch und Irrtum fand ich jedoch die folgenden Arbeiten (mit SQL Developer Version 3.0.04). Posting hier im Fall hilft es anderen:

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

Das ist das selbe wie die erste Version in meiner Antwort, außer dass Sie eine 'var' zu jeder Variable im' declare' Block hinzugefügt haben, die ungültig ist. Der Versuch, dies auszuführen, ergibt PLS-00103: Das Symbol "NUMMER" wurde gefunden, als eines der folgenden ... und ähnliche Fehler gegen die anderen fünf Variablen erwartet wurden. –

+0

Ich stimme Alex zu. Downvoted wegen der 'var', und ich brauchte' .package' nicht in meinem Aufruf, zumindest in 3.2.20.10, der nicht so anders sein sollte, und bekam Fehler, als ich es tat. Viel Zeit mit dieser Antwort verschwendet. – vapcguy

0

SQL Developer Version Mit 4.0.2.15 15.21 folgende Arbeiten Körperbau:

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

Nein, sorry - 'var' vor den Variablen FUNKTIONIERT NICHT - zumindest in SQL Developer 3.2.20.10, und sollte keine Doppelpunkte davor verwenden - nicht nötig, zumindest in 3.2.20.10 (nur der Grund, warum ich das nicht abgelehnt oder bearbeitet habe). Außerdem würde nach "SET SERVEROUTPUT ON" ein Semikolon benötigt. – vapcguy

8

Für diejenigen sqldeveloper 3+ mit, falls Sie verpasst, dass:

SqlDeveloper verfügt über eine Funktion zum direkten Ausführen von Stored Proc/Function und die Ausgabe wird in einer leicht lesbaren Weise angezeigt.

Einfach Rechtsklick auf das Paket/gespeichert proc/gespeicherte Funktion, klicken Sie auf Run und wählen target die proc sein/func Sie ausführen möchten, wird sqldeveloper das Code-Snippet generieren auszuführen (so dass Sie Ihre Eingabe setzen können Parameter). Nach der Ausführung werden Ausgabeparameter in der unteren Hälfte des Dialogfelds angezeigt, und es gibt sogar eine integrierte Unterstützung für den Ref-Cursor: Das Ergebnis des Cursors wird als separates Ausgabetab angezeigt.

+0

Dies sollte die ausgewählte Antwort sein. – EvilTeach

-2

Erstellen von Pl/SQL-Block kann schmerzhaft sein, wenn Sie viele Prozeduren haben, die viele Parameter haben. Es gibt eine application geschrieben auf Python, die es für Sie tun. Es analysiert die Datei mit Prozedurdeklarationen und erstellt die Webanwendung für bequeme Prozeduraufrufe.

1

Keine dieser anderen Antworten funktionierte für mich. Hier ist, was ich eine Prozedur in SQL Developer laufen 3.2.20.10 zu tun hatte:

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 würden Sie gehen, um die Tabelle überprüfen, was auch immer Ihr proc sollte mit dem übergebenen in Variable zu tun - - Die Ausgabe bestätigt nur, dass die Variable den Wert erhalten hat (und theoretisch an den proc übergeben wurde).

HINWEIS (Unterschiede zu meinen vs.andere):

  • Keine : vor dem Variablennamen
  • Keine .package. oder .packages. zwischen dem Schemanamen und dem Prozedurnamen
  • Nein, die zur Behebung & in den Wert der Variablen zu setzen.
  • Keine Verwendung print überall
  • Kein var mit der variablen

All diese Probleme links zu erklären, mich für die längste mein Kopf kratzen und diese Antworten, die diese ungeheuerlichen Fehler haben herausgenommen werden und geteert und gefiedert.

Verwandte Themen