Nejprve zjistíme hlavičku dané procedury.
DESC MY_PROCEDURE;
Příkaz DESCRIBE (DESC) lze v Oracle použít kromě tabulek, indexů a jiných objektů také na funkce a procedury. V dřívějších verzích jej šlo použít i na procedury v balíčcích, bohužel tato funkcionalita byla z novějších verzí odstraněna, takže následující příklad nebude
fungovat.
DESC MY_PACKAGE.MY_PROCEDURE; -- chyba ORA-04043
Pokud tedy potřebujeme zjistit informace o proceduře z balíčku, jako nejjednodušší se jeví provést příkaz describe přímo na balíčku.
DESC MY_PACKAGE;
Poté z delšího výpisu (záleží na počtu funkcí a procedur) vyčíst potřebné informace. Existuje pochopitelně i jiná možnost – vyhledat si informaci přímo v metadatech. Bylo by to nějak
takto (jména objektů musejí být velkými písmeny):
SELECT ARGUMENT_NAME, IN_OUT, DATA_TYPE FROM ALL_ARGUMENTS WHERE
PACKAGE_NAME = 'MY_PACKAGE' AND
OBJECT_NAME = 'MY_PROCEDURE'
ORDER BY POSITION;
Nyní můžeme volat proceduru, která má kupříkladu jeden IN parametr a tři OUT. To se provede
takto.
VARIABLE P1 VARCHAR2(250);
VARIABLE P2 VARCHAR2(250);
VARIABLE P3 VARCHAR2(250);
VARIABLE P4 VARCHAR2(250);
CALL MY_PACKAGE.MY_PROCEDURE(:P1, :P2, :P3, :P4)
PRINT P2
PRINT P3
PRINT P4
Druhá možnost je vytvořit si anonymní blok v PL/SQL a proceduru zavolat podobným způsobem. Namísto příkazů VARIABLE/PRINT se však použije syntaxe PL/SQL a výpis do výstupu serveru pomocí DBMS_OUTPUT.PUT_LINE.
SET SERVEROUTPUT ON;
DECLARE
P1 VARCHAR(250);
...
BEGIN
P1 := 'xxxx';
MY_PACKAGE.MY_PROCEDURE(PARAM1 => P1, ...)
DBMS_OUTPUT.PUT_LINE(P1)
...
END;
Některé nástroje usnadňují vytvoření výše uvedeného stubu, například v SQL Developeru můžete proceduru chytnout a přetáhnout ji do sheetu. Musíte však přidat DBMS_OUTPUT volání a aktivovat výstupní konzoli (okno Dbms Output).
Tento zápisek vznikl převodem z mého starého blogu. Ne všechny texty byly takto převedeny, kompletní archiv již není k dispozici.
Volání funkcí and procedur v SQL*Plus
April 23, 2010