Можно ли использовать процедуры, курсоры и триггеры в пользовательских типах с объектно-реляционными базами данных? - PullRequest
0 голосов
/ 26 апреля 2020

Я новичок в объектно-реляционных базах данных, в настоящее время обучаю себя из учебника.

При создании пользовательских типов в Oracle с таблицами объектов UDT можно использовать процедуры, курсоры, триггеры и т. Д. c. или эти функции можно использовать только с реляционными базами данных?

Я потратил время на поиск в Интернете, чтобы найти этот ответ сам, но я нахожусь в той точке, где я так много читал о топи c, что меня смущает Я подумал, что на этот вопрос можно ответить просто здесь (надеюсь).

1 Ответ

0 голосов
/ 26 апреля 2020

При создании пользовательских типов в Oracle, с таблицами объектов UDT, можно ли использовать процедуры, курсоры, триггеры и т. Д. c.

Да.

или эти функции можно использовать только с реляционными базами данных?

Нет.


CREATE TYPE person IS OBJECT(
  id NUMBER,
  first_name VARCHAR2(50),
  last_name VARCHAR2(50),
  mother REF PERSON,
  MEMBER FUNCTION full_name( self IN PERSON )
    RETURN VARCHAR2,
  MEMBER FUNCTION children (self IN PERSON )
    RETURN SYS_REFCURSOR
);

CREATE TABLE people OF person (
  ID PRIMARY KEY
);

CREATE TYPE BODY person IS
  MEMBER FUNCTION full_name( self IN PERSON )
    RETURN VARCHAR2
  IS
  BEGIN
    RETURN self.first_name || ' ' || self.last_name;
  END;

  MEMBER FUNCTION children( self IN PERSON )
    RETURN SYS_REFCURSOR
  IS
    p_cursor SYS_REFCURSOR;
  BEGIN
    OPEN p_cursor FOR
    SELECT VALUE(p) AS child
    FROM   people p
    WHERE  p.mother.id = self.id;

    RETURN p_cursor;
  END;
END;
/

CREATE SEQUENCE people__id__seq;

CREATE TRIGGER people__new__trg
BEFORE INSERT ON people
FOR EACH ROW
  WHEN (new.ID IS NULL)
BEGIN
  :new.ID := PEOPLE__ID__SEQ.NEXTVAL;
END;
/

INSERT INTO people ( first_name, last_name )
SELECT 'Alice', 'Abbot' FROM DUAL UNION ALL
SELECT 'Belle', 'Burns' FROM DUAL UNION ALL
SELECT 'Carol', 'Charles' FROM DUAL;

UPDATE people
SET mother = ( SELECT REF(p) FROM people p WHERE id=2 )
WHERE id = 3;

Тогда:

SELECT id,
       first_name,
       last_name, 
       p.mother.id
FROM   people p;

Выходы:

ID | FIRST_NAME | LAST_NAME | MOTHER.ID
-: | :--------- | :-------- | --------:
 1 | Alice      | Abbot     |      <em>null</em>
 2 | Belle      | Burns     |      <em>null</em>
 3 | Carol      | Charles   |         2

Показывает, что триггер сработал, генерируя ID значения для строк.

и

DECLARE
  p_person PERSON;
  p_child  PERSON;
  p_cursor SYS_REFCURSOR;
BEGIN
  SELECT VALUE( p )
  INTO   p_person
  FROM   people p
  WHERE  id = 2;

  p_cursor := p_person.children();
  DBMS_OUTPUT.PUT_LINE( 'Children of ' || p_person.full_name );

  LOOP
    FETCH p_cursor INTO p_child;
    EXIT WHEN p_cursor%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE( p_child.full_name );
  END LOOP;

  CLOSE p_cursor;
END;
/

Выходы:

Children of Belle Burns
Carol Charles

Показывает пример курсора из функции. Процедуры также возможны и оставлены в качестве примера для OP.

db <> fiddle здесь

...