
Strona o szybkim czytaniu.
Oracle dostarcza całego zestawu specjalnych narzędzi do stosowania w PL/SQL w postaci pakietów wbudowanych. Każdy taki pakiet zawiera pewną zamkniętą funkcjonalność w postaci procedur, funkcji, typów, wyjątków itp.
Właścicielem pakietów wbudowanych (podobnie jak innych obiektów systemowych) jest użytkownik SYS. Inni użytkownicy korzystają z synonimów publicznych, aby odwoływać się do zawartości pakietów wbudowanych. Zdecydowana większość pakietów tworzy się automatycznie podczas tworzenia słownika systemowego w trakcie procesu zakładania bazy danych, część jednak, w razie takiej potrzeby należy utworzyć „ręcznie” uruchamiając odpowiedni skrypt na użytkowniku SYS. Ilość wszystkich pakietów wbudowanych jest ogromna (przeszło 100).
Rozdział poniższy ma na celu zapoznanie z najbardziej popularnymi z nich, przy czym nie zostanie w nim przedstawiona pełna funkcjonalność (tej należy szukać w dokumentacji), ale zostaną tylko wzmiankowane problemy, do rozwiązania których mogą być przydatne pakiety wbudowane.
Dynamiczny SQL pozwala na następujące rzeczy, niedostępne w standartowym PL/SQL:
Dynamiczny SQL można realizować na dwa sposoby:
EXECUTE IMEDIATE komenda;
która powoduje wykonanie się komendy dynamicznie umieszczonej w zmiennej znakowej komenda
.
-- Wykonanie najprostszego typu polecenia:
-- Zmodyfikowanie zarobków wszystkim pracownikom na stanowisku
-- AGENT korzystając z dbms_sql.
CREATE OR REPLACE PROCEDURE dynamic_dbms
IS
cursor_handle number;
rows_updated number;
BEGIN
-- otwarcie kursora
cursor_handle := dbms_sql.open_cursor;
-- Parsowanie polecenia
dbms_sql.parse(cursor_handle,
‘UPDATE emp ‘ ||
‘ SET sal = sal + 1000 ‘ ||
‘ WHERE job = ‘’AGENT’’’,
dbms_sql.native);
-- wykonanie polecenia
rows_updated := dbms_sql.execute(cursor_handle);
-- zamknięcie kursora
dbms_sql.close_cursor(cursor_handle);
END;
Tylko w Oracle 8i
-- Podobnie jak powyżej, ale korzystając z Native Dynamic SQL
CREATE OR REPLACE PROCEDURE dynamic_native
IS
BEGIN
EXECUTE IMEDIATE ‘UPDATE emp ‘ ||
‘ SET sal = sal + 1000 ‘ ||
‘ WHERE job = ‘’AGENT’’’;
END;
Warto pamiętać, że pakiet dbms_sql posiada również procedury służące do pobierania z bazy danych wartości typu LONG, oraz w przeciwieństwie do native dynamic sql może realizować przetwarzanie tablicowe. W przypadku stosowania dynamicznego SQL’a prawa do wykonywanych dynamicznie poleceń powinny być przyznane nie poprzez rolę, ale bezpośrednio poleceniem grant.
Procedury są wykonywane w kontekście uprawnień właściciela procedury. Skoro właścicielem pakietu dbms_sql jest SYS, mogłoby to rodzić poważne niebezpieczeństwo, dlatego pakiet ten jest wykonywany w kontekście użytkownika wołającego podprogram (AUTHID CURRENT_USER).