plsql
Типы объектов
Поиск…
замечания
Важно отметить, что тело объекта может не всегда быть необходимым. Если конструктор по умолчанию достаточен, и никакая другая функциональность не должна быть реализована, то его не следует создавать.
Конструктор по умолчанию представляет собой поставляемый Oracle конструктор, который состоит из всех атрибутов, перечисленных в порядке объявления. Например, экземпляр BASE_TYPE может быть сконструирован следующим вызовом, хотя мы явно не объявляем его.
l_obj := BASE_TYPE(1, 'Default', 1);
BASE_TYPE
Объявление типа:
CREATE OR REPLACE TYPE base_type AS OBJECT
(
base_id INTEGER,
base_attr VARCHAR2(400),
null_attr INTEGER, -- Present only to demonstrate non-default constructors
CONSTRUCTOR FUNCTION base_type
(
i_base_id INTEGER,
i_base_attr VARCHAR2
) RETURN SELF AS RESULT,
MEMBER FUNCTION get_base_id RETURN INTEGER,
MEMBER FUNCTION get_base_attr RETURN VARCHAR2,
MEMBER PROCEDURE set_base_id(i_base_id INTEGER),
MEMBER PROCEDURE set_base_attr(i_base_attr VARCHAR2),
MEMBER FUNCTION to_string RETURN VARCHAR2
) INSTANTIABLE NOT FINAL
Тип кузова:
CREATE OR REPLACE TYPE BODY base_type AS
CONSTRUCTOR FUNCTION base_type
(
i_base_id INTEGER,
i_base_attr VARCHAR2
) RETURN SELF AS RESULT
IS
BEGIN
self.base_id := i_base_id;
self.base_attr := i_base_attr;
RETURN;
END base_type;
MEMBER FUNCTION get_base_id RETURN INTEGER IS
BEGIN
RETURN self.base_id;
END get_base_id;
MEMBER FUNCTION get_base_attr RETURN VARCHAR2 IS
BEGIN
RETURN self.base_attr;
END get_base_attr;
MEMBER PROCEDURE set_base_id(i_base_id INTEGER) IS
BEGIN
self.base_id := i_base_id;
END set_base_id;
MEMBER PROCEDURE set_base_attr(i_base_attr VARCHAR2) IS
BEGIN
self.base_attr := i_base_attr;
END set_base_attr;
MEMBER FUNCTION to_string RETURN VARCHAR2 IS
BEGIN
RETURN 'BASE_ID ['||self.base_id||']; BASE_ATTR ['||self.base_attr||']';
END to_string;
END;
MID_TYPE
Объявление типа:
CREATE OR REPLACE TYPE mid_type UNDER base_type
(
mid_attr DATE,
CONSTRUCTOR FUNCTION mid_type
(
i_base_id INTEGER,
i_base_attr VARCHAR2,
i_mid_attr DATE
) RETURN SELF AS RESULT,
MEMBER FUNCTION get_mid_attr RETURN DATE,
MEMBER PROCEDURE set_mid_attr(i_mid_attr DATE),
OVERRIDING MEMBER FUNCTION to_string RETURN VARCHAR2
) INSTANTIABLE NOT FINAL
Тип кузова:
CREATE OR REPLACE TYPE BODY mid_type AS
CONSTRUCTOR FUNCTION mid_type
(
i_base_id INTEGER,
i_base_attr VARCHAR2,
i_mid_attr DATE
) RETURN SELF AS RESULT
IS
BEGIN
self.base_id := i_base_id;
self.base_attr := i_base_attr;
self.mid_attr := i_mid_attr;
RETURN;
END mid_type;
MEMBER FUNCTION get_mid_attr RETURN DATE IS
BEGIN
RETURN self.mid_attr;
END get_mid_attr;
MEMBER PROCEDURE set_mid_attr(i_mid_attr DATE) IS
BEGIN
self.mid_attr := i_mid_attr;
END set_mid_attr;
OVERRIDING MEMBER FUNCTION to_string RETURN VARCHAR2
IS
BEGIN
RETURN (SELF AS base_type).to_string || '; MID_ATTR [' || self.mid_attr || ']';
END to_string;
END;
LEAF_TYPE
Объявление типа:
CREATE OR REPLACE TYPE leaf_type UNDER mid_type
(
leaf_attr VARCHAR2(1000),
CONSTRUCTOR FUNCTION leaf_type
(
i_base_id INTEGER,
i_base_attr VARCHAR2,
i_mid_attr DATE,
i_leaf_attr VARCHAR2
) RETURN SELF AS RESULT,
MEMBER FUNCTION get_leaf_attr RETURN VARCHAR2,
MEMBER PROCEDURE set_leaf_attr(i_leaf_attr VARCHAR2),
OVERRIDING MEMBER FUNCTION to_string RETURN VARCHAR2
) INSTANTIABLE FINAL
Тип кузова:
CREATE OR REPLACE TYPE BODY leaf_type AS
CONSTRUCTOR FUNCTION leaf_type
(
i_base_id INTEGER,
i_base_attr VARCHAR2,
i_mid_attr DATE,
i_leaf_attr VARCHAR2
) RETURN SELF AS RESULT
IS
BEGIN
self.base_id := i_base_id;
self.base_attr := i_base_attr;
self.mid_attr := i_mid_attr;
self.leaf_attr := i_leaf_attr;
RETURN;
END leaf_type;
MEMBER FUNCTION get_leaf_attr RETURN VARCHAR2 IS
BEGIN
RETURN self.leaf_attr;
END get_leaf_attr;
MEMBER PROCEDURE set_leaf_attr(i_leaf_attr VARCHAR2) IS
BEGIN
self.leaf_attr := i_leaf_attr;
END set_leaf_attr;
OVERRIDING MEMBER FUNCTION to_string RETURN VARCHAR2 IS
BEGIN
RETURN (SELF AS mid_type).to_string || '; LEAF_ATTR [' || self.leaf_attr || ']';
END to_string;
END;
Доступ к хранимым объектам
CREATE SEQUENCE test_seq START WITH 1001;
CREATE TABLE test_tab
(
test_id INTEGER,
test_obj base_type,
PRIMARY KEY (test_id)
);
INSERT INTO test_tab (test_id, test_obj)
VALUES (test_seq.nextval, base_type(1,'BASE_TYPE'));
INSERT INTO test_tab (test_id, test_obj)
VALUES (test_seq.nextval, base_type(2,'BASE_TYPE'));
INSERT INTO test_tab (test_id, test_obj)
VALUES (test_seq.nextval, mid_type(3, 'MID_TYPE',SYSDATE - 1));
INSERT INTO test_tab (test_id, test_obj)
VALUES (test_seq.nextval, mid_type(4, 'MID_TYPE',SYSDATE + 1));
INSERT INTO test_tab (test_id, test_obj)
VALUES (test_seq.nextval, leaf_type(5, 'LEAF_TYPE',SYSDATE - 20,'Maple'));
INSERT INTO test_tab (test_id, test_obj)
VALUES (test_seq.nextval, leaf_type(6, 'LEAF_TYPE',SYSDATE + 20,'Oak'));
Возвращает ссылку на объект:
SELECT test_id
,test_obj
FROM test_tab;
Возвращает ссылку на объект, нажав все на подтип
SELECT test_id
,TREAT(test_obj AS mid_type) AS obj
FROM test_tab;
Возвращает дескриптор строки каждого объекта по типу
SELECT test_id
,TREAT(test_obj AS base_type).to_string() AS to_string -- Parenthesis are needed after the function name, or Oracle will look for an attribute of this name.
FROM test_tab;
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow