Neue PL/SQL Features III - PRAGMA DEPRECATE
Heute setzen wir unsere Serie neuer PL/SQL Features mit einem weiteren neuen PRAGMA fort. Es dient der Pflege von PL/SQL Code und ermöglicht es, Programmteile als veraltet (deprecated) zu markieren. Das neue PRAGMA DEPRECATE gibt es ab der Datenbank Version 12.2. Wie man es verwendet, erklären wir Ihnen. Im folgenden Beispiel erstellen wir ein Package mit einer Prozedur. Eine weitere Prozedur soll dann die Prozedur aus dem Package verwenden. Das ist im Grunde recht einfach.
SQL> create or replace package pkg_legacy_functions authid definer
2 is
3 procedure prc_do_nothing;
4 end;
5 /
Package wurde erstellt.
SQL> create or replace package body pkg_legacy_functions
2 is
3 procedure prc_do_nothing
4 as
5 begin
6 null;
7 end;
8 end;
9 /
Package Body wurde erstellt.
SQL> create or replace procedure prc_use_legacy authid definer
2 as
3 begin
4 pkg_legacy_functions.prc_do_nothing;
5 end;
6 /
Prozedur wurde erstellt.
Nun entwickelt sich der Code des Package weiter und es werden neue Prozeduren und Funktionen hinzugefügt, die möglicherweise andere Prozeduren und Funktionen überflüssig machen. Aber wie macht man das anderen Entwicklern bekannt? Und wie verhindert bzw. behindert man die Benutzung der alten Programmteile? Einfach aus dem Package entfernen wäre eine Lösung. Aber damit wären alle abhängigen Programmteile auf einmal INVALID. Es wäre also eine harte Umstellung für den gesamten Code erforderlich. Eine langsame und schrittweise Umstellung wäre doch viel günstiger. Und hier kommt PRAGMA DEPRECATE ins Spiel. Damit lassen sich Programmteile als veraltet markieren, die Programmteile bleiben aber erhalten und lassen sich auch weiterhin verwenden. Für unser Beispiel sieht das dann so aus.
SQL> create or replace package pkg_legacy_functions authid definer
2 is
3 procedure prc_do_nothing;
4
5 PRAGMA DEPRECATE (
6 prc_do_nothing,
7 'pkg_legacy_functions.prc_do_nothing veraltet. Stattdessen pkg_legacy_functions.prc_null verwenden.'
8 );
9
10 procedure prc_null;
11 end;
12 /
Package wurde erstellt.
SQL> create or replace package body pkg_legacy_functions
2 is
3 procedure prc_do_nothing
4 as
5 begin
6 null;
7 end;
8 procedure prc_null
9 as
10 begin
11 null;
12 end;
13 end;
14 /
Package Body wurde erstellt.
Man sieht, mit dem PRAGMA lässt sich der veraltete Programmteil definieren und auch eine Meldung generieren, die auf die neuen Möglichkeiten verweist. Was passiert also nun, wenn man die veraltete Prozedur weiter im Code verwendet?
SQL> create or replace procedure prc_use_legacy authid definer
2 as
3 begin
4 pkg_legacy_functions.prc_do_nothing;
5 end;
6 /
Prozedur wurde erstellt.
Auf den ersten Blick scheint sich nichts zu ändern. Das liegt daran, dass das PRAGMA DEPRECATE eben keine Fehler verursacht sondern einfach Warnungen erzeugt. Man muss also die Kompilerwarnungen erst einmal aktivieren um den Effekt zu erkennen.
SQL> alter session set plsql_warnings = 'enable:all';
Session wurde geändert.
SQL> create or replace procedure prc_use_legacy authid definer
2 as
3 begin
4 pkg_legacy_functions.prc_do_nothing;
5 end;
6 /
SQL> create or replace procedure prc_use_legacy authid definer
2 as
3 begin
4 pkg_legacy_functions.prc_do_nothing;
5 end;
6 /
SP2-0804: Prozedur mit Kompilierungswarnungen erstellt
SQL> show err
Fehler bei PROCEDURE PRC_USE_LEGACY:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/3 PLW-06020: Referenz auf eine veraltete Entity: PRC_DO_NOTHING
deklariert in Einheit PKG_LEGACY_FUNCTIONS[3,13].
pkg_legacy_functions.prc_do_nothing veraltet. Stattdessen
pkg_legacy_functions.prc_null verwenden.
Mit eingeschalteten Warnungen sieht man nun den Effekt. Einerseits ist die Kompilierung nun mit Warnungen erfolgt. Die Anzeige der Warnungen bringt den definierten Text aus dem PRAGMA zum Vorschein. Entwickler werden also auf diese Weise benachrichtigt und können ihren Code anpassen ohne das große Meetings abgehalten werden müssen und ohne das Programmteile INVALID werden.
Natürlich kann dieses PRAGMA nicht nur in Packagespezifikationen angegeben werden, wie im Beispiel. Es können damit auch ganze Packages, Funktionen und Prozeduren, Typen und Subtypen sowie Variablen, Constanten, Cursor und Exceptions als veraltet markiert werden.
SQL> create or replace package pkg_mehrwertsteuer authid definer
2 is
3 c_mehrwersteuer constant number := 16;
4 PRAGMA DEPRECATE (c_mehrwersteuer);
5
6 function fnc_get_mehrwertsteuer return number;
7 end;
8 /
Package wurde erstellt.
SQL> create or replace package body pkg_mehrwertsteuer
2 is
3 function fnc_get_mehrwertsteuer return number
4 as
5 begin
6 return c_mehrwersteuer;
7 end;
8 end;
9 /
Package Body wurde erstellt.
Auch hier ist es wieder wichtig, die Warnungen auch zu aktivieren. Dies kann auch gezielt für die Warnungen erfolgen, die mit dem PRAGMA DEPRECATE in Verbindung stehen.
SQL> alter session set plsql_warnings='ENABLE:(6019,6020,6021,6022)';
Session wurde geändert.
SQL> alter package pkg_mehrwertsteuer compile body;
SP2-0811: Package Body mit Kompilierungswarnungen geändert
SQL> show err
Fehler bei PACKAGE BODY PKG_MEHRWERTSTEUER:
LINE/COL ERROR
-------- -----------------------------------------------------------------
6/12 PLW-06020: Referenz auf eine veraltete Entity: C_MEHRWERSTEUER
deklariert in Einheit PKG_MEHRWERTSTEUER[3,3]
Es gibt also viele Möglichkieten, einzelne Codeteile als veraltet zu markieren. Und mit den Standardeinstellungen lässt sich trotzdem alles fehlerfrei kompilieren. Erst durch das Aktivieren der Warnungen erhält man Informationen zu den veralteten Bestandteilen. Mehr Beispiele dazu findet man unter anderem auch in Oracle's LiveSQL.
Kommentare
Keine Kommentare