Технология Клиент-Сервер 1999'3 |
|||||||
|
Этот код создает пример базы данных, представленной на рис.1 и используемой в этой статье.
CREATE TYPE PHONE_LIST_T AS VARRAY(10) OF VARCHAR2(20) / CREATE TYPE ADDRESS_T AS OBJECT ( street VARCHAR2(200), city VARCHAR2(200), state CHAR(2), zip VARCHAR2(20)) / CREATE OR REPLACE TYPE CUSTOMER_INFO_T AS OBJECT ( custno NUMBER, custname VARCHAR2(200), address address_t, phone_list phone_list_t, MAP MEMBER FUNCTION cust_order RETURN INTEGER, PRAGMA RESTRICT_REFERENCES (cust_order, WNDS, WNPS, RNPS, RNDS)) / show errors CREATE TYPE STOCK_INFO_T AS OBJECT ( stockno NUMBER, cost NUMBER, tax_code NUMBER) / -- определяем функции-члены CREATE OR REPLACE TYPE BODY CUSTOMER_INFO_T AS MAP MEMBER FUNCTION cust_order RETURN INTEGER IS BEGIN RETURN 99999 - custno ; END; END; / CREATE TABLE CUSTOMER_TAB OF CUSTOMER_INFO_T (custno PRIMARY KEY) / CREATE TABLE STOCK_TAB OF STOCK_INFO_T (stockno PRIMARY KEY) / CREATE TYPE LINE_ITEM_T AS OBJECT ( lineitemno NUMBER, stockref REF stock_info_t, quantity NUMBER, discount NUMBER) / CREATE OR REPLACE TYPE LINE_ITEM_LIST_T AS TABLE OF LINE_ITEM_T / CREATE OR REPLACE TYPE PURCHASE_ORDER_T AS OBJECT ( pono NUMBER, custref REF customer_info_t, orderdate DATE, shipdate DATE, line_item_list line_item_list_t, shiptoaddr address_t, MAP MEMBER FUNCTION ret_value RETURN NUMBER, PRAGMA RESTRICT_REFERENCES (ret_value, WNDS, WNPS, RNPS, RNDS), MEMBER FUNCTION total_value RETURN NUMBER, PRAGMA RESTRICT_REFERENCES (total_value, WNDS, WNPS)) / CREATE OR REPLACE TYPE BODY PURCHASE_ORDER_T AS MEMBER FUNCTION total_value RETURN NUMBER IS i INTEGER; stock stock_info_t; line_item line_item_t; total NUMBER := 0; cost NUMBER; BEGIN FOR i IN 1..SELF.line_item_list.COUNT LOOP line_item := SELF.line_item_LIST(i); SELECT DEREF(line_item.stockref) INTO stock FROM DUAL ; total := total + line_item.quantity * stock.cost ; END LOOP; RETURN total; END; MAP MEMBER FUNCTION ret_value RETURN NUMBER IS BEGIN RETURN pono; END; END; / show errors /* Теперь создадим таблицы. Обратите внимание что в purchase_order_t есть поле line_item_list с вложенной таблицей – так что нужно определить вложенную таблицу. Заметьте также, что ВЛОЖЕННАЯ таблица создается в том же пространстве, что и родительская.*/ CREATE TABLE PURCHASE_TAB OF PURCHASE_ORDER_T ( PRIMARY KEY (pono), SCOPE FOR (custref) IS customer_tab) NESTED TABLE line_item_list STORE AS PO_LINE_TAB / -- Specify scope and change the storage for the nested table. ALTER TABLE PO_LINE_TAB ADD (SCOPE FOR (stockref) IS stock_tab) / ALTER TABLE PO_LINE_TAB STORAGE (NEXT 5K PCTINCREASE 5 MINEXTENTS 1 MAXEXTENTS 20) / /* Колонка NESTED_TABLE_ID - псевдоколонка, имеющаяся во всех вложенных таблицах. Она может быть использована сама по себе или в совокупности с другими полями (nested_table_id, lineitemno) для to ensure that you only have distinct rows (objects in the table) in the nested table. Использование NESTED_TABLE_ID также ускоряет выполнение запросов к вложенной таблице.*/ CREATE UNIQUE INDEX PO_NESTED ON po_line_tab (NESTED_TABLE_ID, lineitemno) / /* Дальнейшее несущественно для нашего обсуждения, однако вы можете создать Indexes/constraints для объектов – как показано ниже: */ CREATE OR REPLACE TYPE TEST_TYPE AS OBJECT( stk_obj stock_info_t, binno number) / CREATE TABLE TEST_TABLE OF TEST_TYPE ( PRIMARY KEY (stk_obj.stockno)); /* В качестве первичного ключа используется скалярная переменная встроенного объектного типа. Субобъект (stk_obj) как таковой нельзя использовать в качестве первичного ключа.*/
Copyright © 1994-2016 ООО "К-Пресс"