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
Aug 302014
 

Vcelku častý scénář – potřebujem zvalidovat constrain a zároveň jsme si vědomi, že data jsou špinavá a validace constrainu nám hnedtak neprojde. Takže nezbývá než nějaké řádky promazat či jinak vyřešit duplikace. Dnešní tip je věnován klauzuli EXCEPTIONS INTO, která je spoučástí příkazu ALTER TABLE a umožní uložit rowid duplicitních řádků při validaci constrainu. Takže hurá do toho!

CREATE TABLE TEST_CONS_EX AS SELECT ROWNUM AS ID FROM DUAL CONNECT BY LEVEL<=666;

A ještě nějaké náhodné duplicity (29 řádků)

INSERT INTO TEST_CONS_EX SELECT A FROM (SELECT ROWNUM A FROM DUAL CONNECT BY LEVEL<=666) WHERE ORA_HASH(A,21)=7;

Nic zajimavého, tabulka s jedním sloupcem ID s čísly od 1 do 666 s tím, že duplikovaných hodnot je tam 29, vždycky po dvou kouskách. Následně je potřeba vytvořit tabulku do které se porušení constrainu bude reportovat. Oracle odkazuje na scripty UTLEXCPT.SQL nebo UTLEXPT1.SQL. Ovšem stačí mít jen tabulku ve správné struktuře a není potřeba používat tyhle scripty.

CREATE TABLE dej_to_sem(row_id ROWID,
owner VARCHAR2(30),
table_name VARCHAR2(30),
constraint VARCHAR2(30));

Dokonce se to i hezky pamatuje, rowid, owner, jméno tabulky, jméno constrainu. Velikost přestně tolik, koli to může maximálně mít. Nyní vytvořme nějaký PK klíč. Neměl by být enabled.

ALTER TABLE TEST_CONS_EX ADD CONSTRAINT test_pk PRIMARY KEY (id) DISABLE;

A nyní enable společně s exceptions into klauzulí:

ALTER TABLE TEST_CONS_EX ENABLE CONSTRAINT test_pk EXCEPTIONS INTO DEJ_TO_SEM;¨
SQL Error: ORA-00001: nesplněna podmínka jedinečnosti (AZOR3.TEST_PK)

Sice nás to vyfuckovalo, ale díky použití klauzule máme k dispozici rowid řádků, které jsou duplicitní:

Data v exceptions tabulce..

Důležité je pamatovat si, že každý řádek, který je tam duplicitní je tam tolikrát kolikrát je duplicitní (nikoliv n-1) tedy odmazat z master tabulky všechny záznamy, které jsou uvedeny v tabulce duplicit rozhodně není dobrý nápad, šéf ani Marta Jandová by za to nepochváli. Exspeciálně, když další logický krok po odmazání je zapnutí constrainu, což je příkaz ALTER TABLE, což je změna struktury tabulky a tedy nemožnost napsat nějakou verzi flashaback selectu (ORA-01466: nelze číst data – definice tabulky byla změněna) Jinak žádné záludnosti, tabulka pro uložení duplikací musí být pochopitelně přístupná majiteli constrainu.

 Posted by at 15:31

  2 Responses to “Rychlotip #21 – Enable constrainu a EXCEPTIONS INTO”

  1. Diky za hint. Uz jsem se bal, ze ses na blog vykaslal…

  2. Ale nevykašlal, neboj. Jen nemám čas z ustavičného ptaní se Jiřího jestli už má sedačky ;)

 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>