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:
execute
; w PL / SQL jest interpretowane jako początekexecute immediate
, co różni się od SQLexecute
.execute
.declare
Powinny być przedbegin
. Myślę, że @OMG miało na myśli to, że możesz zadeklarować zmienne w SQL Developer przed anonimowym blokiem za pomocąvariable
słowa kluczowego, a następnie użyć:out1
składni takiej, jaka była pierwotnie, w takim przypadku w ogóle nie maszdeclare
sekcji. Ale mieszasz te dwa z ostatniego komentarza.Odpowiedzi:
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
:var
zmiennych 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;
źródło
:var
.declare
Domyślnie użyłbym tego sposobu, gdybym robił cokolwiek z PL / SQL; ale mógłbym użyć,:var
jeś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.:
(w rzeczywistości to nie działało).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.
źródło
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
Run
i wybierz, czytarget
chcesz 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.źródło
Otwórz procedurę w SQL Developer i uruchom ją stamtąd. SQL Developer wyświetla uruchomiony SQL.
BEGIN PROCEEDURE_NAME_HERE(); END;
źródło
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.
źródło
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
źródło
Ż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):
:
przed nazwą zmiennej.package.
lub.packages.
między nazwą schematu a nazwą procedury&
w wartości zmiennej.print
Nigdzie nie używajvar
ma potrzeby deklarowania zmiennejWszystkie 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.
źródło
Nie mogę uwierzyć, to nie zadziała w SQL Developer:
ALE to będzie:
Oczywiście wszystko musi być w jednej linii.
źródło
execute
polecenia] 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 .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; /
źródło
var
zanim 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 średnikaSET SERVEROUTPUT ON
.Aby uruchomić procedurę z poziomu SQL tylko dla programistów, wykonaj następujące polecenie
EXECUTE PROCEDURE_NAME;
źródło
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;
źródło
var
do 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.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ź.--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;
źródło
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.
źródło
var out_para_name refcursor; execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name); print :out_para_name;
źródło