PL/SQL-private-Objekt Methode
Ich bin ein bisschen neu zu Oracle ' s PL/SQL (über 10g), ich Frage mich, ob es einen Weg gibt, um eine private Methode in einem Objekt-Typ, wie es oft getan für private Hilfsmethoden in anderen Sprachen (Java, C++, C#, etc...). Ich wissen ist es möglich, private Methoden in den Paketen, aber ich kann nicht scheinen zu finden ein Weg, dies zu tun für Objekt-Typen. Ich bekomme immer compiler-Fehler sagt mir:
Fehler: PLS-00539: Unterprogramm 'FOO' erklärt wird, in ein Objekt-Typ Körper und die definiert sein muss in der Objekt-type-Spezifikation.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, hier ist eine mögliche Lösung, die ich getestet habe, sehr kurz, und es scheint zu funktionieren so weit:
Erstellen einer übergeordneten Objekt-Typ, wird markiert als NICHT ENDGÜLTIG und NICHT INSTANZIIERBAREN und legen Sie dann alle der private code gibt. Die private-Methoden nicht wirklich privat, sondern darum, Sie in einer Art, die nicht endgültig und nicht instanziierbaren verhindert, dass Sie nicht aufgerufen wird. In der instanziierbaren Subtyp, Verweis auf die "private" Methoden in der Supertyp durch sich SELBST.
Beispiel:
Nun muss ich zugeben, ich weiß nicht wirklich, wie dieses Muster. Es scheint ungeschickt und notdürftigem. Werde ich Sie wahrscheinlich nur vermeiden, Objekttypen, so viel wie ich kann und halten Sie sich an die Pakete (oder sehr simlpe Objekt-Typen). Ein Paket-als-fatory nur hilft mir lösen die privaten common code problem für Konstruktoren, nicht jedoch für andere Arten von common-code-refactoring.
...es sei denn, es gibt eine bessere Art zu arbeiten mit Objekt-Typen.... wer? wer?
Wenn Sie einfach auf das Unterprogramm (Funktion/Prozedur), die aus einem Unterprogramm PL/SQL erlaubt das verschachteln Unterprogramm innerhalb einer anderen in der Erklärung zu blockieren.
Es ist nicht so ideal, da die privaten Methoden oder Funktionen, aber es könnte einen Versuch Wert sein, bevor Sie gehen, erstellen einer Vererbungshierarchie.
Wenn Sie auf Oracle 12, hast du Glück. Sie können ein Paket erstellen, dass nur deine Art code gegen die Verwendung der ZUGÄNGLICHEN BY-Klausel. Im untenstehenden Beispiel wird der PL/SQL-compiler nur dass der code aus FOO_T Referenz FOO_PRIVATE_PKG.
Können Sie nicht private Methoden in pl/sql-Objekte, die Sie haben können, Polymorphismus und Vererbung aber keine Kapselung.
Wenn Sie möchten Kapselung (private Methoden), die Sie verwenden können pl/sql-Pakete.
Alle drei auf einmal ist nicht möglich.
Die Antwort ist etwas schwierig, aber ich werde es erklären, so gut ich kann. Erstens, es ist nicht völlig Oracle die Schuld, ANSI-SQL definiert eine so genannte Abstrakte Datentypen (ADT ' s), die verwendet werden können, zu erweitern SQL. Oracle folgt Ihren Vorgaben ziemlich gut denke ich. Ein Teil der fehlenden Kapselung kommt mit der Schwierigkeit, zu referenzieren und speichern von Objekten in SQL. Ich werde nicht in die details gehen hier, aber da verstehe ich nicht es selbst.
ADT ' s sind hilfreich, um Struktur, um Ihre Daten, entweder im code oder Tabellen, aber Sie können nicht sehr Komplex sein. Zum Beispiel können Sie nicht Objekt A mit Objekt B, welches wiederum Objekt A. Dies kann nicht gespeichert werden in einer SQL-Tabelle. Sie können dies umgehen, durch die Verwendung von REFs in Oracle (nicht sicher, wie andere Anbieter gehen über diese), aber das wird ein weiteres zu lösendes problem im code.
Habe ich herausgefunden, dass ADT ' s sind gut für sehr einfache Strukturen und sehr einfache member-Methoden. Etwas aufwändiger, erfordert, dass die Pakete. Oft, ich werde schreiben Sie eine Paket, die member-Methoden für einen bestimmten Objekt-Typ, da kann nicht aufgerufen werden private Methoden in einem Objekt.
Es ist ein Schmerz...