Я продолжаю серию из трех выпусков об объектно-ориентированном программировании в Oracle PL/SQL.
Манипулирование объектами в PL/SQL
В этом разделе рассказывается как манипулировать методами и атрибутами объектов в PL/SQL.
Доступ к атрибутам объекта в "точечной" нотации
Вы ссылаетесь к атрибуту по его имени. Чтобы получить доступ к значению атрибута или изменить его используйте "точечную" нотацию. Имена атрибутов
могут выстраиваться в последовательности, таким образом осуществляется доступ к вложенным типам.
Пример 12-4 Доступ к атрибутам объекта
DECLARE
emp employee_typ;
BEGIN
emp := employee_typ(315, 'Francis', 'Logan', 'FLOGAN',
'555.777.2222', '01-MAY-04', 'SA_MAN', 11000, .15, 101, 110,
address_typ('376 Mission', 'San Francisco', 'CA', '94222'));
DBMS_OUTPUT.PUT_LINE(emp.first_name || ' ' || emp.last_name);
DBMS_OUTPUT.PUT_LINE(emp.address.street);
DBMS_OUTPUT.PUT_LINE(emp.address.city || ', ' ||emp. address.state || ' ' ||
emp.address.postal_code);
END;
/
Вызов конструкторов и методов объекта
Вызовы конструкторов осуществляются так же как и вызовы функций. Как и все функции, конструктор вызывается как часть выражения, как показано в
примерах 12-4 и 12-5.
Когда вы передаете параметры в конструктор, инициализационные значения передаются атрибутам создаваемого объекта. Если Вы вызываете конструктор по
умолчанию для передачи значений атрибутам, Вы должны передать значения для всех атрибутов. Вы можете вызвать конструктор, используя именованную или
позиционную нотацию.
Подобно подпрограммам пакеджей, методы вызываются используя "точечную" нотацию. В примере 12-6, метод display_address вызывается, чтобы показать
атрибуты объекта. Обратите внимание на использование функции VALUE, которая возвращает значение объекта. VALUE принимает аргумент для корреляции
переменных. В этом контексте корреляция переменных это переменная ряда или псевдоним таблицы с рядом объектной таблицы.
Пример 12-6 Доступ к методам объекта
DECLARE
emp employee_typ;
BEGIN
SELECT VALUE(e)
INTO emp
FROM employee_tab e
WHERE e.employee_id = 310;
emp.display_address();
END;
/
Для статических методов, используйте вызов типа type_name.method_name вместо вызова, специфического для экземпляра типа.
При вызове метода экземпляра подтипа фактически вызываемый метод зависит от объявлений в иерархии типов. Если подтип переопределяет метод, который
наследуется от супертипа, то фактически выполняется метод подтипа. Если подтип не переопределяет метод, то вызывается метод супертипа. Эта возможность
известна как динамическая диспетчеризация метода.
Примечание:
Если Вы реализуете методы на PL/SQL, Вы не можете вызывать метод базового объекта и супертипа с ключевым словом super или эквивалентный метод в
наследуемом объекте.
Изменение и удаление объектов
Из PL/SQL блока вы можете модифицировать и удалять ряды в объектной таблице.
Пример 12-7 Изменение и удаление рядов в объектной таблице
DECLARE
emp employee_typ;
BEGIN
INSERT INTO employee_tab
VALUES (employee_typ(370, 'Robert', 'Myers', 'RMYERS','555.111.2277','07-NOV-04',
'SA_REP', 8800, .12, 101, 110,
address_typ('540 Fillmore', 'San Francisco', 'CA', '94011'))
);
UPDATE employee_tab e
SET e.address.street = '1040 California'
WHERE e.employee_id = 370;
DELETE FROM employee_tab e
WHERE e.employee_id = 310;
END;
/
Манипуляции объектами через Ref модификаторы
Вы можете использовать ссылки, используя функцию REF, аргументом которой является связанная переменная.
Пример 12-8 Изменение рядов о объектной таблице, используя REF модификатор.
DECLARE
emp employee_typ;
emp_ref REF employee_typ;
BEGIN
SELECT REF(e)
INTO emp_ref
FROM employee_tab e
WHERE e.employee_id = 370;
UPDATE employee_tab e
SET e.address = address_typ('8701 College', 'Oakland', 'CA', '94321')
WHERE REF(e) = emp_ref;
END;
/
Вы можете объявлять ссылки как переменные, параметры, поля или атрибуты. Вы можете использовать ссылки как выходные или выходные переменные в
выражениях SQL.
Вы не можете использовать ссылки в PL/SQL. Например, присвоение в примере 12-9 с использованием ссылки не допустимо. Вместо ссылки используйте
функцию DEREF или обратитесь к объекту через пакедж UTL_REF. Информацию о функции REF смотрите в "Oracle Database SQL Reference".
Пример 12-9 Использование DEREF в выражении SELECT INTO
DECLARE
emp employee_typ;
emp_ref REF employee_typ;
emp_name VARCHAR2(50);
BEGIN
SELECT REF(e)
INTO emp_ref
FROM employee_tab e
WHERE e.employee_id = 370;
-- следующее присвоение вызовет исключение, такая операция не допустима в PL/SQL
-- emp_name := emp_ref.first_name || ' ' || emp_ref.last_name;
-- emp := DEREF(emp_ref); не допускается использование DEREF в процедурных выражениях
SELECT DEREF(emp_ref)
INTO emp
FROM DUAL; -- использование пустой таблицы DUAL
emp_name := emp.first_name || ' ' || emp.last_name;
DBMS_OUTPUT.PUT_LINE(emp_name);
END;
/
Информацию о функции DEREF смотрите в "Oracle Database SQL Reference".