Warning: Declaration of Suffusion_MM_Walker::start_el(&$output, $item, $depth, $args) should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in /DISK2/WWW/plsql.cz/www/wp-content/themes/suffusion/library/suffusion-walkers.php on line 0
Feb 072013
 


Dnešní rychlotip se týká šikovné funkce, která jako vstup dostane jména dvou objektů a vrátí takové statementy, které alterují objekt číslo jedna takovým  způsobem, aby se z něj stal strukturně stejný objekt číslo dva. Tato báječná  funkce se jmenuje COMPARE_ALTER a je z package DBMS_METADATA_DIFF.

Signatura funkce je následující:

   FUNCTION compare_alter (
                object_type     IN VARCHAR2,
                name1           IN VARCHAR2,
                name2           IN VARCHAR2,
                schema1         IN VARCHAR2 DEFAULT NULL,
                schema2         IN VARCHAR2 DEFAULT NULL,
                network_link1   IN VARCHAR2 DEFAULT NULL,
                network_link2   IN VARCHAR2 DEFAULT NULL)
        RETURN CLOB;

 Myslím, že názvy parametrů mluví za vše – typ objektu (TABLE, INDEX..) jejich jména a kde jsou umístěny (schéma a případně databázový link).

 1) Založme dvě malé, leč rozlišné tabulky:

   create table tbl_a(a number,
   b varchar2(10) not null);

 create table tbl_b(a number not null,
  b varchar2(10),
  c number primary key);

2) Zavolání funkce compare_alter
select dbms_metadata_diff.compare_alter('TABLE','TBL_A','TBL_B') from dual;

Výsledek:
ALTER TABLE "AZOR"."TBL_A" ADD ("C" NUMBER)
ALTER TABLE "AZOR"."TBL_A" MODIFY ("A" NOT NULL ENABLE)
ALTER TABLE "AZOR"."TBL_A" MODIFY ("B" NULL)
ALTER TABLE "AZOR"."TBL_A" ADD PRIMARY KEY ("C") USING INDEX PCTFREE 10 INITRANS 2 ENABLE
ALTER TABLE "AZOR"."TBL_A" RENAME TO "TBL_B"

3) Nyní aplikace (mimo přejmenování na stejný název) získaných ALTER statementů:

table TBL_A altered.
table TBL_A altered.
table TBL_A altered.
table TBL_A altered.

 4) A ukázka toho, že jsou objekty stejné:

Stejná struktura tabulek

Stejná struktura tabulek

A jeden tip na využití:
Pokud kopírujeme strukturu tabulky, tak typicky používáme CTAS + nesplnitelnou podmínku:

create table tbl_c as select * from tbl_a where 1=2;

Což bohužel nezachovává všechny constrainty, tohle ano.
Šikovná věcička, co? Bohužel – triggery to neumí, indexy to neumí a co hůře – občas to vyhodí nevalidní statement (prázdné závorky u storage, například).

 Posted by at 17:52

 Leave a Reply

(required)

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>