Продолжается подписка на наши издания! Вы не забыли подписаться?

Листинг 1:

Этот код создает пример базы данных, представленной на рис.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 ООО "К-Пресс"