Die Aussage, die Sie zeigen:
Verwenden Sie die Anweisung CREATE TYPE die Angabe eines Objekttyp, ein SQLJ Objekttyp erstellen:
CREATE OR REPLACE TYPE "TY_STRING_T";
an incomplete object type schafft , eine benannte variierende Anordnung (Varray), eine geschachtelte Tabellentyp oder unvollständiger Objekttyp.
...
Ein unvollständiger Typ ist eine Art durch eine Vorwärtstypdefinition erstellt. Es heißt "unvollständig", weil es einen Namen aber keine Attribute oder Methoden hat. Es kann von anderen Typen referenziert werden und kann so dazu verwendet werden, Typen zu definieren, die sich aufeinander beziehen. Sie müssen den Typ jedoch vollständig angeben, bevor Sie ihn zum Erstellen einer Tabelle oder einer Objektspalte oder einer Spalte eines geschachtelten Tabellentyps verwenden können.
Die object-relational developer's guide enthält weitere Informationen über unvollständige Typen und Beispiele für deren Verwendung.
Das ist nicht, was Sie haben. Sie instanziieren und füllen einen Varray, keinen Objekttyp. It would not compile the PL/SQL code with the incomplete type - Sie erhalten einen PLS-00311: the declaration of "TY_STRING_T" is incomplete or malformed
Kompilierungsfehler.
Von Kommentaren haben Sie keinen überschreibenden PL/SQL-Typ und (vom Chat) bestätigt die all_dependencies
Ansicht, dass Ihre Pakete vom SQL-Level-Typ abhängig sind. Aber es kann nicht so definiert werden, wie Sie es für richtig halten.
Sie können mit der aktuellen Ist-Definition des Typs überprüfen
select dbms_metadata.get_ddl('TYPE', 'TY_STRING_T') from dual;
Mit der Aussage zeigte man, dass die Renditen:
DBMS_METADATA.GET_DDL('TYPE','TY_STRING_T')
--------------------------------------------------------------------------------
CREATE OR REPLACE TYPE "STACKOVERFLOW"."TY_STRING_T" ;
Wieder von Chat, wenn Sie laufen, dass Sie wirklich sehen:
CREATE OR REPLACE TYPE "AAA"."TY_STRING_T" as table of varchar2(32767);
was viel mehr Sinn macht. Oracle hat den Teil as table...
selbst jedoch nicht hinzugefügt - da es glücklich gewesen wäre, es als einen unvollständigen Objekttyp zu belassen; du hättest es nicht benutzen können, schon gar nicht als wäre es ein Varray.
In einem anderen Teil Ihrer Codebasis wurde der Typ mit der neuen, vollständigen Definition neu erstellt. oder jemand hat den Typ manuell neu erstellt (vor dem Erstellen der Pakete, die darauf verweisen). Wenn ich spekulieren müsste, würde ich denken, dass dies ein Problem mit der Quellcodeverwaltung sein könnte - dass unvollständiger Code eingecheckt und versandt wurde und in jeder Umgebung, in der er installiert wurde, korrigiert werden musste. Oder möglicherweise, dass der Code nach der Installation zu einer Version geändert wurde, die nicht mehr korrekt ist.
Der Typname deutet darauf hin, dass es immer eine Tabelle von Strings sein sollte, nicht ein Objekttyp; und die abgeschnittene Version des create-Befehls, die Sie gefunden haben, hätte niemals eine Varray erstellt.
Sie verpassen wirklich nichts in Ihrem Verständnis, es ist nur das, was Sie betrachten, nicht die Realität widerspiegelt.
Sind Sie sicher, dass Sie keine übergeordnete Definition in Ihren Paketen haben, so dass Sie einen PL/SQL-Typ haben, der Vorrang hat? Oder vielleicht in einem anderen Schema, obwohl das offensichtlicher wäre. Oder dass der SQL-Level-Typ später nicht neu definiert wird? Soweit ich weiß, können Sie nichts mit einem unvollständigen Typ machen, außer es mit einer Objektdefinition zu vervollständigen; aber Sie bezeichnen es nicht als Objekttyp. –
Danke für die Hinweise. Ich werde sie überprüfen. – Jagger
@AlexPoole Gibt es einen Compilerfehler, wenn Sie versuchen, einen solchen Schematyp zu definieren und ihn dann in der angegebenen Weise zu verwenden? – Jagger