Volání funkcí and procedur v SQL*Plus

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.
23 April 2010 | oldblog
twitter.com linkedin.com
google.com/+ facebook.com
flickr.com youtube.com