24. November 2010

Kleine, nützliche Verbesserung in 11.2: CREATE OR REPLACE TYPE ... FORCE

Tiny useful change in 11.2: CREATE OR REPLACE TYPE FORCE
Erstellt Ihr öfter Objekttypen in eurem Datenbankschema. Wenn Ihr die Pipelined Table Functions verwendet, macht Ihr das, denn man braucht Objekttypen, um die zurückgegebene Tabelle zu beschreiben. Oracle 11.2 bringt eine kleine, aber nützliche Verbesserung mit, wenn die Objekttypen geändert werden müssen. Bislang musste man den Objekttypen löschen und neu anlegen - und wenn noch abhängige Typen da sind, müssen diese vorher auch gelöscht werden. Die die neue CREATE OR REPLACE TYPE ... FORCE-Option in der Version 11.2 erlaubt es, einen Objekttypen zu ändern, ohne die anhängigen Typen vorher löschen zu müssen. Eine solche Änderung geht nun also wesentlich leichter von der Hand ...
Do you frequently create object types in your database schema. You will do so if you use pipelined table functions since you need the types to describe the table returned by the function. Oracle 11.2 brings a tiny, but useful enhancement when it's about changing the type definitions. In previous versions you just can't change an object type's definition - you have to drop and recreate it. And when there are dependent types you have to drop all those types first. The new CREATE OR REPLACE TYPE ... FORCE syntax in 11.2 allows to change an object types' definition without looking at the dependent types. Changes are therefore much more easy to implement.
SQL> create type row_t as object(id number, col1 varchar2(2000));
  2  /

Typ wurde erstellt.

SQL> create type table_t as table of row_t;
  2  /

Typ wurde erstellt.

SQL> create or replace type row_t force as object(id number, col1 varchar2(2000), col2 date);
  2  /

Typ wurde erstellt.

SQL> desc table_t
 table_t TABLE OF ROW_T
 Name                                      Null?    Typ
 ----------------------------------------- -------- ----------------------------

 ID                                                 NUMBER
 COL1                                               VARCHAR2(2000)
 COL2                                               DATE
Die FORCE Option funktioniert nicht mehr, wenn der Typ als Datentyp in Tabellen verwendet wurde.
The FORCE option will not work when you have used the object type as the data type for a table column.
SQL> create table test_tab (col table_t) nested table col store as column_ntab;

Tabelle wurde erstellt.

SQL> create or replace type row_t force as object(
  2    id number, 
  3    col1 varchar2(2000),
  4    col2 date, 
  5    col3 timestamp
  6  );
  7  /

*
FEHLER in Zeile 1:
ORA-22866: cannot replace a type with table dependents
Eine kleine, aber manchmal nützliche Änderung ... und die muss es ja auch geben ...
A small, but sometimes useful change. And these are also very important ...

Kommentare:

Andriy Terletskyy hat gesagt…

Klasse! So was wurde schon lange gewünscht. Sehr nützliche Feature, für die PL/SQL Programmierung mit Object-Types.

Anonym hat gesagt…

Sehr gute Sachen.

Beliebte Postings