Uruchomić procedurę składowaną w programie SQL Developer?

81

Próbuję uruchomić procedurę składowaną, która ma wiele parametrów wejścia i wyjścia. Procedurę można wyświetlić tylko w moim panelu Połączenia, przechodząc do opcji Inni użytkownicy | | Pakiety | |

Jeśli kliknę prawym przyciskiem myszy, pozycje menu to „Zamów członków według ...” i „Utwórz test jednostkowy” (wyszarzone). Możliwość „Uruchomienia” procedury nie wydaje się możliwa, gdy użytkownik uzyskuje do niej dostęp.

Próbowałem znaleźć przykład, jak utworzyć anonimowy blok, aby móc uruchomić procedurę jako plik SQL, ale nie znalazłem niczego, co działa.

Czy ktoś wie, jak mogę wykonać tę procedurę od SQL Developer? Używam wersji 2.1.1.64.

Z góry dziękuję!

EDYCJA 1:

Procedura, którą chcę wywołać, ma następujący podpis:

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)

Jeśli napiszę swój anonimowy blok w ten sposób:

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;

Wyskakuje mi błąd:

Bind Varialbe "out1" is NOT DECLCARED
anonymous block completed

Próbowałem zainicjować zmienne out *:

   out1 VARCHAR2(100) := '';

ale pojawia się ten sam błąd:

EDYCJA 2:

Opierając się na odpowiedzi Alexa, spróbowałem usunąć dwukropki sprzed parametrów i otrzymałem to:

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:
sdoca
źródło
Spróbuj umieścić zmienne OUT wewnątrz BEGIN, przed instrukcją wykonania procedury.
OMG Kucyki
Nie potrzebujesz execute; w PL / SQL jest interpretowane jako początek execute immediate, co różni się od SQL execute.
Alex Poole,
2
@sdoca: mylisz teraz dwa podejścia; z wersją edit 2 po prostu usuń słowo execute. declarePowinny być przed begin. Myślę, że @OMG miało na myśli to, że możesz zadeklarować zmienne w SQL Developer przed anonimowym blokiem za pomocą variablesłowa kluczowego, a następnie użyć :out1składni takiej, jaka była pierwotnie, w takim przypadku w ogóle nie masz declaresekcji. Ale mieszasz te dwa z ostatniego komentarza.
Alex Poole,
1
Tak, wiedziałem, że jestem zdezorientowany, ale nie byłem pewien, gdzie / jak.
sdoca

Odpowiedzi:

75

Z prostymi typami parametrów (tj. Nie refcursorami itp.) Możesz zrobić coś takiego:

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


Edytowano zgodnie ze specyfikacją OP i alternatywnym podejściem do wykorzystywania :varzmiennych wiążących:

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;
Alex Poole
źródło
1
+1 ładna odpowiedź. Czy z ciekawości wiesz, który jest preferowany?
Conrad Frix
@Conrad: Wyobrażam sobie, że to kwestia preferencji, chociaż może być więcej przełączania kontekstu :var. declareDomyślnie użyłbym tego sposobu, gdybym robił cokolwiek z PL / SQL; ale mógłbym użyć, :varjeśli, powiedzmy, użyłem fragmentu istniejącego kodu skopiowanego z Pro * C, który już miał taką składnię i nie chciałem dotykać parametrów w wywołaniu.
Alex Poole,
2
Dzięki za pomoc i szczegółową odpowiedź. Jestem pewien, że pomoże to również innym. Należy zauważyć, że muszą one być uruchamiane jako skrypty, a nie instrukcje.
sdoca
1
Podczas pracy w programie sql developer, nie musiałem poprzedzać nazw zmiennych :(w rzeczywistości to nie działało).
haridsv
29

Wykonywanie łatwe. Uzyskanie wyników może być trudne.

Spójrz na to pytanie, które zadałem Najlepszy sposób / narzędzie, aby uzyskać wyniki procedury pakietu Oracle

Podsumowanie tego wygląda następująco.

Zakładając, że masz pakiet o nazwie mypackage i procedurę o nazwie getQuestions. Zwraca refcursor i przyjmuje nazwę użytkownika w postaci łańcucha.

Wszystko, co musisz zrobić, to utworzyć nowy plik SQL (nowy plik). Ustaw połączenie i wklej w następujący sposób i wykonaj.

var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;
Conrad Frix
źródło
3
Musiałem użyć pełnego słowa „wykonaj” zamiast „exec”
Patrick
21

Dla tych, którzy używają SqlDeveloper 3+, na wypadek gdybyś to przeoczył:

SqlDeveloper ma funkcję bezpośredniego wykonywania zapisanych procesów / funkcji, a dane wyjściowe są wyświetlane w czytelny sposób.

Po prostu kliknij prawym przyciskiem myszy pakiet / przechowywany proces / funkcję przechowywaną, kliknij Runi wybierz, czy targetchcesz być proc / func, który chcesz wykonać, SqlDeveloper wygeneruje fragment kodu do wykonania (abyś mógł umieścić parametry wejściowe). Po wykonaniu parametry wyjściowe są wyświetlane w dolnej połowie okna dialogowego, a nawet mają wbudowaną obsługę kursora ref: wynik kursora zostanie wyświetlony jako osobna karta wyników.

Adrian Shum
źródło
2
To powinna być wybrana odpowiedź.
EvilTeach
12

Otwórz procedurę w SQL Developer i uruchom ją stamtąd. SQL Developer wyświetla uruchomiony SQL.

BEGIN
  PROCEEDURE_NAME_HERE();
END;
kolęda
źródło
6

Posługiwać się:

BEGIN

  PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);

END;

Zastąp „PACKAGE_NAME”, „PROCEDURE_NAME” i „parameter_value” na to, czego potrzebujesz. Parametry wyjściowe należy zadeklarować przed.

Kucyki OMG
źródło
2

Chociaż to pytanie jest dość stare, wciąż natrafiam na ten sam wynik bez znalezienia łatwego sposobu na uruchomienie programu sql developer. Po kilku próbach znalazłem łatwy sposób na wykonanie procedury składowanej od samego programisty sql.

  • W sekcji Pakiety wybierz żądany pakiet i kliknij prawym przyciskiem myszy nazwę pakietu (nie nazwę procedury składowanej).

  • Znajdziesz opcję uruchomienia. Wybierz to i podaj wymagane argumenty. Kliknij OK i zobaczysz wynik w sekcji zmiennych wyjściowych poniżej

Używam SQL Developer w wersji 4.1.3.20

Narasimha
źródło
1

Żadna z tych odpowiedzi nie działała dla mnie. Oto, co musiałem zrobić, aby uruchomić procedurę w SQL Developer 3.2.20.10:

SET serveroutput on;
DECLARE
  testvar varchar(100);
BEGIN
  testvar := 'dude';
  schema.MY_PROC(testvar);
  dbms_output.enable;
  dbms_output.put_line(testvar);
END;

A potem musiałbyś sprawdzić tabelę pod kątem tego, co twój proc miał zrobić z tą przekazaną zmienną - wyjście potwierdzi tylko, że zmienna otrzymała wartość (i teoretycznie przekazała ją do proc).

UWAGA (różnice między moim a innymi):

  • Nie :przed nazwą zmiennej
  • Bez wstawiania .package.lub .packages.między nazwą schematu a nazwą procedury
  • Brak konieczności umieszczania &w wartości zmiennej.
  • printNigdzie nie używaj
  • Nie varma potrzeby deklarowania zmiennej

Wszystkie te problemy sprawiły, że najdłużej drapałem się w głowę i te odpowiedzi, w których te rażące błędy zostały usunięte, smolone i upierzone.

vapcguy
źródło
0

Nie mogę uwierzyć, to nie zadziała w SQL Developer:

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

print r;

ALE to będzie:

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

print r;

Oczywiście wszystko musi być w jednej linii.

Amel Music
źródło
2
Dokumentacja [SQL * Plus dla executepolecenia] stwierdza to. Nie jest to jednak odpowiedź na pytanie, które zostało zadane i zostało już wcześniej omówione w bardziej odpowiednich odpowiedziach na inne pytania .
Alex Poole,
Mogłem go używać w SQL Developer. Dzięki
Sergejs
0

Przy użyciu programu SQL Developer w wersji 4.0.2.15 Build 15.21 działa:

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;
/
Jacek
źródło
Nie, przepraszam - varzanim zmienne NIE DZIAŁAJĄ - przynajmniej w SQL Developer 3.2.20.10 i nie powinny używać przed sobą dwukropków - znowu nie ma takiej potrzeby, przynajmniej w 3.2.20.10 (jedyny powód, dla którego nie nie głosuj na to ani nie edytuj). Następnie potrzebowałby średnika SET SERVEROUTPUT ON.
vapcguy
0

Aby uruchomić procedurę z poziomu SQL tylko dla programistów, wykonaj następujące polecenie

EXECUTE PROCEDURE_NAME;

AmolRavan
źródło
-1

Nie udało mi się uruchomić odpowiedzi @Alex Poole. Jednak metodą prób i błędów znalazłem następujące prace (używając SQL Developer w wersji 3.0.04). Publikowanie go tutaj na wypadek, gdyby pomogło innym:

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;
ggkmath
źródło
2
To jest to samo, co pierwsza wersja w mojej odpowiedzi, z wyjątkiem tego, że dodałeś vardo każdej zmiennej wdeclare bloku, która jest nieprawidłowa. Próba uruchomienia tego daje 'PLS-00103: Napotkano symbol „LICZBA”, gdy spodziewano się jednego z następujących ...' i podobne błędy w porównaniu z pozostałymi pięcioma zmiennymi.
Alex Poole
Zgadzam się z Alexem. Negocjowany, ponieważvar i nie musiałem używać .package.w moim wywołaniu, przynajmniej w 3.2.20.10, co nie powinno być tak różne, i otrzymałem błędy, gdy to zrobiłem. Zmarnowałem dużo czasu na tę odpowiedź.
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;
v8-E
źródło
-2

Tworzenie bloku Pl / SQL może być bolesne, jeśli masz wiele procedur, które mają wiele parametrów. Istnieje aplikacja napisana w Pythonie, która zrobi to za Ciebie. Analizuje plik z deklaracjami procedur i tworzy aplikację internetową do wygodnego wywoływania procedur.

nmax
źródło
-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;
Pomocnik
źródło