FIRST_NAME

问题描述 投票:0回答:1

我是对象关系型数据库的新手,目前从教科书上自学。

在Oracle中创建用户定义类型时,用UDT对象的表,是否可以使用过程、游标、触发器等,还是这些功能只能在关系数据库中使用?

我花了时间在网上搜索,自己也想找到这个答案,但是我现在已经看了很多关于这个话题的文章,让我很困惑,所以我想在这里可以简单的回答一下(希望)。

oracle stored-procedures user-defined-types object-relational-model
1个回答
0
投票

在Oracle中创建用户定义类型时,使用UDT对象的表,是否可以使用过程、游标、触发器等。

可以。

还是这些功能只有在关系型数据库中才能使用?

是的.还是这些功能只能在关系型数据库中使用?


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 
© www.soinside.com 2019 - 2024. All rights reserved.