Schimbarea tipului de date al obiectului

Dacă trebuie să schimbați tipul de structură de date, comanda ALTER TYPE nu va fi în măsură să ajute - și asta este o soluție pentru a lucra.

Chiar și designul cel mai bine planificate a unei baze de date, uneori, trebuie să se schimbe. În lumea veche, pur relațională, care schimba de multe ori a fost o sarcină simplă. Odată cu apariția unor constrângeri cheie străine face proces mai complicat - un simplu import / export, a încetat să funcționeze. Acum, odată cu apariția tehnologiilor orientate-obiect, creșterea numărului de dependențe încorporate în datele dicționar Oracle chiar mai complicat procesul de modificare. Datorită abundența de posibile legături între obiecte în tipul de date obiect bază de date nu poate fi izolat cu ușurință pentru modificarea -, prin urmare, nu este surprinzător faptul că comanda ALTER TYPE va mai schimba structura bazei de date.

Din fericire, există încă o soluție pe care o puteți folosi pentru a schimba tipul de structura de date și obiectele sale dependente. La baza acestei abordări este conversia entităților orientate pe obiecte în echivalent relațională, și, ulterior, conversia inversă a obiectelor - în teorie simplu, dar în practică mod destul de enigmatic. Acest articol oferă o analiză pas cu pas a acestui proces cu exemple dintr-o mostră de date orientate pe obiecte care conțin refs, încorporate obiecte și funcții noi membru. După cum ați citit articolul, act de faptul că o parte din ea poate fi utilizată în traducerea entităților relaționale în entitate Oracle7 Oracle8. Mai mult, exemple pot fi informații utile lucrul cu entitățile construite folosind tipuri de obiecte.

Limitări ALTER TYPE

După crearea unui tip de obiect de date ALTER opțiuni de comandă tip sunt limitate să-l schimbe. Această comandă poate fi utilizată pentru a adăuga noi proceduri și funcții, dar le elimina pe cele existente pe care nu se poate. Și dacă vedeți apt pentru a schimba componentele individuale de tip de obiect, este necesar să se distrugă tipul în sine și recrea-l. Cu toate acestea, în cazul în care ați reușit să creați tabele sau obiecte relaționale (de exemplu, variabile, tablouri, VARRAYS obiect sau tabel), în funcție de tipul de obiect, distruge tipul pe care nu permit. Desigur, putem rezolva problema prin forță - dar după eliminarea tipului de obiect tabele sau obiecte dependente devin complet inaccesibile - chiar dacă acestea încă mai există.

Metoda noastră evită această pierdere de acces la obiecte dependente. Dar, înainte de a trece la descrierea, câteva cuvinte pe baza noastra de date.

Un exemplu al unei baze de date orientate pe obiect

Fig. 1. Această diagramă prezintă tipurile de date și alte obiecte ale bazei noastre de date eșantion.
Săgețile indică încorporate obiecte și de referință (REF) către alte obiecte.

Dacă aveți dorința de a experimenta cu baza de date - pentru formarea în manipularea obiectelor - Listarea 2 conține un cod pentru a popula tabelele.

Modificarea tipului de structură de date

Deoarece aceste modificări simple ALTER comanda TYPE nu a făcut, va trebui să meargă în altă parte. Workaround este de a muta datele din tabelul de obiect în timpul set de tabele relaționale, distrugerea tabelelor obiect și tipurile de date asociate, a crea tabele și tipuri de modificări în structura și de umplere a noului tabel cu datele din momentul tabelelor relaționale. Procesul poate fi complicată din cauza prelucrării speciale a tabelelor imbricate, iar tabelele conținute în REF.

Următoarea listă conține un pas cu pas descriere a procesului. Notă - o parte din acesta poate fi folosit pentru a converti datele în obiect de tabelă V7 Oracle8; În acest caz, trebuie să creați un tipuri de obiecte adecvate și pe baza acestor entități, și apoi urmați pașii 7-9 pentru umplerea entităților din relaționalul echivalente. Deci:

În acest exemplu, obiectele CUSTOMER_INFO_T în funcție de tipul de date este CUSTOMER_TAB obiect tabel (bazat direct pe CUSTOMER_INFO_T), tipul de date PURCHASE_ORDER_T (care include REF pe CUSTOMER_INFO_T) și PURCHASE_TAB tabelei obiect (bazat direct pe PURCHASE_TAB). Conform regulii, cu care am început acest punct, se pare că primul ar trebui să fie eliminate tip de date PURCHASE_ORDER_T (și PURCHASE_TAB sale dependente de masă), deoarece conține o REF la CUSTOMER_INFO_T. Urmați pașii 2-5 pentru a elimina aceste obiecte, va trebui să le repete pentru a elimina CUSTOMER_INFO_T și CUSTOMER_TAB. Apoi, etapele 7-8 ar trebui să ajute la reconstrucția primei și umplerea CUSTOMER_INFO_T și CUSTOMER_TAB, și apoi PURCHASE_ORDER_T și PURCHASE_TAB.

2. Crearea unui tabel temporar pentru a stoca date relaționale în tabelele obiect bazate pe modificarea tipului de date (cu excepția datelor din tabele imbricate pe care le preferați în etapa a treia).

2a), în prima etapă de aplicare 2 la baza noastră de date, vom folosi următoarea CREATE TABLE pentru a crea un tabel temporar cu PM solicitat pentru stocarea detalii de master (adică, totul, cu excepția datelor dintr-un tabel imbricat) în PURCHASE_TAB tabelul părinte. Determinarea tabelului PM include numai câmpul cheie (Custno) pentru CUSTOMER_TAB, precum și orice alte elemente CUSTOMER_TAB, deoarece PURCHASE_TAB conține CUSTOMER_TAB sau CUSTOMER_INFO_T; stochează doar un pointer la tipul de date CUSTOMER_INFO-T. În schimb, PM include toate elementele imbricate tip de obiect ADDRESS_T.

3. În cazul în care există tabele imbricate, este necesar să se creeze tabele relaționale copil separat (cu o copie a câmpului părinte care conține cheia primară) pentru stocarea datelor de tabele imbricate.

3a) În primul rând, utilizați următoarea CREATE TABLE pentru a crea un tabel temporar cu numele PC-ului pentru stocarea informațiilor dintr-un tabel imbricat PO_LINE_TAB. Notă câmpul suplimentar Pono, servind cheia primară a PM tabelă părinte. Alte elemente de masă câmpuri pentru copii sunt imbricate tip de tabel LINE_ITEM_T.

3b) o a doua trecere nu va fi - tabele nu mai imbricate.

4. Completați cronometrarea datele din tabel relaționale folosind instrucțiunea INSERT ca întreg și pentru ocazii speciale, de exemplu, atunci când introduceți date dintr-un VARRAY, PL / SQL cod. PL / SQL procedura ar trebui sa fie folosite pentru a evita probleme atunci când încearcă să utilizeze deref la accesarea elementelor individuale de obiecte deref'ed în aceeași SQL-expresie. Atunci când se lucrează cu procedurile VARRAY PL / SQL sunt necesare, deoarece singura modalitate de a accesa VARRAY de SQL * Plus este de a crea un tabel imbricat cu o structură echivalentă VARRAY, resetați VARRAY într-un operator de tabel CAST imbricat, și apoi aplicarea acesteia operatorului.

4a) În primul rând, folosind INSERT pentru a popula tabelul cu date din PURCHASE_TAB PM:

Apoi. utilizând în Listarea 3 proceduri PL / SQL, completați tabelul cu datele dintr-un tabel PO_LINE_TAB PC-ul încorporat.

4b) A doua aplicație din etapa 4 este umplut cu datele din tabelul PT CUSTOMER_TAB prin expresia INSERT:

Apoi, folosind tabelul din listingul 4, procedura PL / SQL, valorile CT umpluturii PHONE_LIST VARRAY în CUSTOMER_TAB.

5. Acum poți și distruge tabelele originale și tipurile de date din tabel întâi, și apoi toate că tipurile de pe care se bazează aceste tabele. Ștergerea tip de date, reveniți la pasul 2 dacă doriți să eliminați orice altceva. Conținutul inima lui Naudalyavshis, mergeți la pasul 6.

5a), mai întâi scoateți tabelul PURCHASE_TAB (această acțiune elimină automat PO_LINE_TAB tabel imbricat), iar apoi PURCHASE_ORDER_T tipul de date.

5b) a doua aplicare etapa 5 se va CUSTOMER_TAB tabelul de îndepărtare și, după aceea, tipul de date CUSTOMER_INFO_T.

6. Să începem cu ultimul dintre tipurile de date de la distanță. Să-l creeze și să redirecționeze obiectele sale dependente, ceea ce face modificările dorite. Înainte de reconstituire, a face alte tipuri de acest tip de date pașii 7 și 8.

6a) Primul tip recreate CUSTOMER_INFO_T prin codul în Listing 5 (adăugarea câmpului Sales_mgr) și CLIENT-TAB funcția de tabelă cust_order, un anumit tip ca o parte CUSTOMER_INFO_T.

6b) A doua etapă de aplicare 6 - restaurare tip de date PURCHASE_ORDER_T, tabele nested și tabelei obiect PO_LINE_TAB PURCHASE_TAB. Din cauza schimbărilor în structura acestor obiecte nu se realizează, creând codul lor este identic cu cel din listingul 1.

7. mese complete obiect noi (adică, toate, dar a investit, dacă este cazul) ale datelor din momentul tabelelor relaționale, actualizarea REF'y, dacă este necesar.

7a) În primul rând, folosind INSERT expresie valori tabel umplere CUSTOMER_TAB de CT. Rețineți că valorile Sales_mgr - de la zero; Desigur, am identificat în această coloană exercițiu Sales_mgr, dar problema de completare a acestuia nu sunt luate în considerare.

7b) A doua etapă de aplicare 7 - Utilizarea de declarații INSERT și UPDATE pentru a pune datele din RM în PURCHASE_TAB Custref REF și actualizarea CUSTOMER_TAB. Notă: definim un tabel imbricat LINE_ITEM_LIST ca „LINE_ITEM_LIST ()“, ceea ce îl face atomically nul (definit, dar nu conține nicio valoare), și nu doar nul. Acest lucru se datorează faptului că nu puteți crea intrări într-un tabel cuibărit pentru anumite intrări în PURCHASE_TAB, în cazul în care LINE_ITEM_LIST este pur și simplu nulă.

8. hasurare imbricate datele din tabel din tabelele temporare, actualizarea REF'y după cum este necesar. Dacă aveți în continuare nevossozdannye tipuri de date sau foi de calcul neumplute, reveniți la pasul 6. Dacă nici unul la stânga, trece la pasul următor.

8a) În primul caz, nu are nimic de-a face - nu există tabele imbricate în CUSTOMER_INFO_T și CUSTOMER_TAB.

8b) Al doilea caz necesită utilizarea descrisă în Listing 6 PL / SQL procedură pentru completarea datelor de masă din tabel temporar PC PO_LINE_TAB și actualizează tabelul REF STOCK_TAB. Procedura împarte procesul în două părți: prima umple tabel imbricat este actualizată REF.

9. Scoateți tabelele relaționale temporare - acestea sunt acum în mod inutil.

În cazul nostru - șterge tabelul CT, PM, și PC (în orice ordine).

Noi oportunități aduc cu ele noi provocări. „Tehnologia Object are multe avantaje“ - o reflectare mai exactă a situațiilor reale cu ajutorul unor tipuri de date definite de utilizator, îmbunătățirea coerenței cu obiecte reutilizarea, dar schimba definiția de tip de date este o muscă în unguent.

Este bine că există soluții, cum ar fi cele de mai sus, pentru a evita unele dintre capcanele.