Промяна на типа на данните на обекта
Ако е необходимо да промените вида на структурата на данните, ALTER TYPE команда няма да може да помогне - и това е временно решение, за да работят.
Дори и най-добре планирано проектиране на база данни, понякога трябва да се промени. В старата, чисто релационна света, които се променят често това е проста задача. С появата на чуждестранни основните пречки да го направи по-сложен процес - обикновен внос / износ спря да работи. Сега, с появата на обектно-ориентирани технологии, ръстът на броя на вградените зависимости в данните речника Oracle още по-сложен процес модификация. Благодарение на изобилието от възможните връзки между обектите в типа данни обект на базата данни не може да бъде лесно изолиран за промяна - затова не е изненадващо, че командата ALTER TYPE вече няма да се промени структурата на базата данни.
За щастие, все още има заобиколно решение, което можете да използвате, за да промените вида на структурата на данните и свързаните с него обекти. В основата на този подход е превръщането на обектно-ориентирани лица в релационна еквивалент, а впоследствие и на обратната превръщането на обекти - в проста теория, но на практика доста озадачаващо начин. В тази статия са една стъпка по стъпка анализ на този процес с примери от образец на обектно-ориентираното база данни, съдържаща литератури, вградени обекти и функции Нас. Както можете да прочетете статията, имайте предвид, че част от него може да се използва в превод на релационни лица в Oracle7 лице Oracle8. Освен това, примери могат да бъдат полезни вникване в работата с образувания конструира при използване на типове обекти.
Ограничения ALTER ТИП
След създаването на обект тип на данните ALTER TYPE командни опции са ограничени до това да се промени. Тази команда може да се използва за добавяне на нови процедури и функции, но се отстранят съществуващите не можете. И ако ти е удобно да се променят отделните компоненти на типа обект, е необходимо да се унищожи вида си и да го пресъздаде. Все пак, ако са успели да създадат релационни таблици или предмети (например променливи, масиви, VARRAYS обект или маса) на базата на вида на обекта, унищожи типа, който не позволяват. Разбира се, можем да решим проблема със сила - но след отстраняването на типа обект, за зависими таблици или предмети стават напълно недостъпни - дори и ако те все още съществуват.
Нашият метод избягва тази загуба на достъп до зависими обекти. Но преди да се пристъпи към описанието, няколко думи за нашата база данни.
Пример за обектно-ориентиран база данни
Фиг. 1. Тази диаграма показва типовете данни и други обекти на нашата извадка на база данни.
Стрелките показват вградените обекти и препратка (REF) до други обекти.
Ако имате желание да се експериментира с базата данни - за обучение в боравене с предмети - Обява 2 съдържа код, за да се пренесат на масите.
Промяна на типа на структурата на данните
Тъй като подобни промени прост ALTER TYPE команда не съм направил, ще трябва да отидете в другата посока. Най-заобиколно е да преместите данните от таблицата за обект в зададеното време на релационни таблици, унищожаването на таблиците за обекти и свързаните с типове данни, създаване на таблици и видове промени в структурата и пълнене на новата таблица с данни от момента на релационни таблици. Процесът може да бъде сложно, тъй като на специална обработка на вложени таблици и таблиците, съдържащи се в Реф.
Следният списък съдържа стъпка по стъпка описание на процеса. Забележка - част от него може да се използва за преобразуване на данни в обект V7 Oracle8 маса; В този случай, трябва да се създаде подходяща типове обекти и въз основа на тези лица, а след това следвайте стъпките 7-9 за пълнене на лица, по отношение на еквивалентните релационни. Така че:
В този пример, обекти CUSTOMER_INFO_T зависи от типа на данните е обект маса CUSTOMER_TAB (директно на базата на CUSTOMER_INFO_T), тип PURCHASE_ORDER_T данни (който включва REF на CUSTOMER_INFO_T) и обект маса PURCHASE_TAB (директно на базата на PURCHASE_TAB). Според правилото, с която започнахме този момент, се оказва, че първите трябва да бъдат отстранени тип PURCHASE_ORDER_T данни (и зависи нейната маса PURCHASE_TAB), тъй като съдържа REF да CUSTOMER_INFO_T. Следвайте стъпки 2-5, за да се отстранят тези обекти, ние ще трябва да ги повтарят за да се отстранят CUSTOMER_INFO_T и CUSTOMER_TAB. След това, на няколко крачки 7-8 би трябвало да помогне за възстановяване на първата и попълване CUSTOMER_INFO_T и CUSTOMER_TAB, и след това за PURCHASE_ORDER_T и PURCHASE_TAB.
2. Създаване на временна таблица за съхранение на релационни данни в обектно таблици въз основа на промяната на типа на данни (с изключение на данни от вложени таблици, които предпочитате през третия етап).
2а) в първия етап кандидатстване от 2 до нашата база данни, ние използваме следната CREATE изявление TABLE за създаване на временна таблица с премиера призова за съхраняване майсторски детайли (това е всичко, с изключение на данните от вложено маса) в PURCHASE_TAB таблицата родител. Определяне на маса PM включва само ключово поле (Custno) за CUSTOMER_TAB, както и всички други елементи CUSTOMER_TAB, тъй PURCHASE_TAB съдържа CUSTOMER_TAB или CUSTOMER_INFO_T; тя съхранява само указател към типа данни CUSTOMER_INFO-T. От друга страна, PM включва всички елементи на вложените тип обект ADDRESS_T.
3. Ако има вложени таблици, е необходимо да се създаде релационни таблици отделно дете (с копие от областта на родител, съдържащ първичен ключ) за съхраняване на данни за вложени таблици.
3а) Първо, използвайте следната CREATE TABLE отчета за създаване на временна таблица с името на компютъра, за съхраняване на информация от вложено маса PO_LINE_TAB. Забележка допълнително поле порно филми, обслужващи първичния ключ на премиера на таблицата родител. Други елементи на маса полета дете са вложени маса тип LINE_ITEM_T.
3б) второ преминаване няма да бъде - не повече вложени таблици.
4. Попълнете времеви данни релационни маса използвате оператора INSERT като цяло и за специални случаи, например, когато вмъкнете данни от VARRAY, PL / SQL код. трябва да се използва PL процедура / SQL, за да се избегнат проблеми, когато се опитват да използват deref при достъп до отделни елементи deref'ed обекти в същата SQL-израз. Когато се работи с VARRAY PL / SQL процедури са необходими, тъй като единственият начин за достъп до VARRAY на SQL * Plus е да се създаде вложени маса с конструкция еквивалент VARRAY, нулиране VARRAY във вложено оператор маса CAST, а след това да го прилагате към оператора.
4а) На първо място, с помощта на вложката да се пренесат в таблицата с данни от PURCHASE_TAB PM:
След това. използване на Обява 3 PL процедура / SQL, попълнете таблицата с данни от компютър вградена маса PO_LINE_TAB.
4б) втори прилагането на етап 4 е изпълнен с данни от таблицата PT CUSTOMER_TAB чрез INSERT израз:
След това, с помощта на таблицата в Обява 4, PL / SQL процедура, стойностите CT на запълване PHONE_LIST VARRAY в CUSTOMER_TAB.
5. Сега можете и да унищожи оригинални маси и типовете данни на таблицата, а след това всички, че видовете, на които се основават тези таблици. Изтриване на тип данни, се върнете към стъпка 2, ако искате да премахнете нещо друго. съдържание Naudalyavshis сърцето си, преминете към стъпка 6.
5а), първо премахнете маса PURCHASE_TAB (това действие автоматично премахва вложени маса PO_LINE_TAB), а след това PURCHASE_ORDER_T на тип данни.
5Ь) второ прилагане стъпка 5 ще CUSTOMER_TAB маса отстраняване и, след това, тип данни CUSTOMER_INFO_T.
6. Да започнем с последния от отдалечени типове данни. Нека да го създаде, и отново насочи зависими обекти, като желаните промени. Преди разтваряне направя другите видове на този тип данни стъпки 7 и 8.
6а) Първа тип Recreate CUSTOMER_INFO_T чрез кода в Обява 5 (добавяне поле Sales_mgr) и Клиентът-TAB маса функция cust_order, определен вид като част CUSTOMER_INFO_T.
6б) втори етап заявление 6 - реставрация тип данни PURCHASE_ORDER_T, вложени таблици и PO_LINE_TAB PURCHASE_TAB обект масата. Поради промени в структурата на тези обекти не се извършва, създавайки им код е идентична с тази, показана на Обявата 1.
7. Пълна нови таблици обект (т.е., всички, но инвестира, ако има такива) на данните от момента на релационни таблици, актуализиране REF'y, ако е необходимо.
7а) На първо място, като се използва израз INSERT запълване маса CUSTOMER_TAB стойности на CT на. Имайте предвид, че стойностите Sales_mgr - нула; Разбира се, ние сме идентифицирали в това упражнение Sales_mgr колона, но въпросът за пълнене му не са взети под внимание.
7б) Втората стъпка приложение 7 - използване на INSERT и UPDATE отчети да се сложи на данни от RM в PURCHASE_TAB Custref REF и актуализиране на CUSTOMER_TAB. Забележка: ние определяме вложено маса LINE_ITEM_LIST като "LINE_ITEM_LIST ()", което го прави с атомна нула (определена, но не съдържа никакви стойности), а не само за нищожна. Това е така, защото не можете да създавате записи във вложено маса за някои вписвания на PURCHASE_TAB, ако LINE_ITEM_LIST е просто нула.
8. Попълнете вложени таблични данни от временните таблици, актуализиране REF'y, както е необходимо. Ако все още имате nevossozdannye типове данни или незапълнени електронна таблица, се върнете към стъпка 6. Ако остане никой да пристъпи към следващата стъпка.
8а) В първия случай няма нищо общо - без вложени таблици в CUSTOMER_INFO_T и CUSTOMER_TAB.
8б) Вторият случай изисква използването описано в Обява 6 PL / SQL-процедура за попълване на данните за маса от PC PO_LINE_TAB временна таблица и актуализира таблицата на REF STOCK_TAB. Процедурата разделя процеса на две части: първата изпълва вложени маса след това се актуализира REF.
9. Премахване на временни релационни таблици - сега те са ненужно.
В нашия случай - изтриване на маса CT, PM и PC (в произволен ред).
Нови възможности носят със себе си нови предизвикателства. "Технология на обекта има много предимства" - по-точно отражение на реални ситуации с помощта на потребителски дефинирани типове данни, подобряване на съгласуваността чрез повторно използване на обекти, но се промени дефиницията на тип данни е една муха в мирото.
Добре е, че има заобикаляне, като по-горе, за да се избегнат някои от капаните.