【问题标题】:Oracle Object-Relational - Is there a way to declare a nested table of a subtype?Oracle Object-Relational - 有没有办法声明一个子类型的嵌套表?
【发布时间】:2021-07-16 13:19:39
【问题描述】:

类型声明:

CREATE TYPE DIPENDENTE_TY AS OBJECT(
    NOME VARCHAR2(20),
    CF CHAR(16),
    DATAN DATE
) NOT FINAL;
/
CREATE TYPE AMMINISTRATORE_TY UNDER DIPENDENTE_TY(
    
);
/
CREATE TYPE MEDICO_TY UNDER DIPENDENTE_TY(
    SPECIALITA VARCHAR2(20),
    REPARTO VARCHAR2(20),
    MEMBER PROCEDURE INSERISCI_VISITA(PAZIENTE VARCHAR,
                                                                        DATAV DATE,
                                                                        TIPOV VARCHAR2,
                                                                        TICKET INTEGER)
);
/
CREATE TYPE PAZIENTE_TY AS OBJECT(
    CF CHAR(16),
    NOME VARCHAR2(20),
    COGNOME VARCHAR2(20)
);
/

CREATE TYPE VISITA_TY AS OBJECT(
    DATA DATE,
    TIPO VARCHAR2(20),
    TICKET INTEGER
);
/
CREATE TYPE COLL_REF_VISITA_TY AS TABLE OF REF VISITA_TY;
/
ALTER TYPE MEDICO_TY ADD ATTRIBUTE VISITATO COLL_REF_VISITA_TY;
/
ALTER TYPE PAZIENTE_TY ADD ATTRIBUTE FA_VISITA COLL_REF_VISITA_TY;
/
ALTER TYPE VISITA_TY ADD ATTRIBUTE DIP REF PAZIENTE_TY CASCADE;
/
ALTER TYPE VISITA_TY ADD ATTRIBUTE DIM REF MEDICO_TY CASCADE;
/
CREATE TABLE PAZIENTE_TAB OF PAZIENTE_TY
NESTED TABLE FA_VISITA STORE AS VISITE_PAZIENTE_TAB;
/
CREATE TABLE DIPENDENTE_TAB OF DIPENDENTE_TY;
/
CREATE TABLE VISITA_TAB OF VISITA_TY;
--(
--DIP SCOPE IS PAZIENTE_TAB,        
--DIM SCOPE IS DIPENDENTE_TAB              
--);
/

我需要声明 Medico_ty 的 VISITATO 嵌套表,但它是 Dipendente_ty 的子类型,因此我只有 Dipendente_ty 类型的实例的表。如何仅为 Medico_ty 实例声明嵌套表?

编辑 当我尝试为 Dipendente_ty 定义表时出现以下错误:

ORA-02320: failure in creating storage table for nested table column TREAT(SYS_NC_ROWINFO$ AS "SQL_PFOHOKUIIIAMJALHSUZHUBDGJ"."MEDICO_TY")."VISITATO" ORA-06512: at "SYS.DBCLOUD_SYS_SEC", line 1404
ORA-06512: at "SYS.DBCLOUD_SYS_SEC", line 2224
ORA-06512: at line 2

【问题讨论】:

  • 请详细描述您到底想要什么。由于“Medico_ty 是 Dipendente_ty 的子类型”,因此您更改 Medico_ty 时不会影响 Dipendente_ty
  • @SayanMalakshinov Medico_ty 具有类型为COLL_REF_VISITA_TY 的VISITATO 属性,它是REF VISITA_TY 的表。我还没有找到为Medico_ty的这个属性声明嵌套表的方法,因为Dipendente_ty类型没有这样的属性,当我尝试为Dipendente_ty定义表时出现以下错误:(我在帖子的编辑部分写的)
  • 是否需要为它声明一个嵌套表?从这个db<>fiddle看来,您不需要这样做。 (此外,您可以使用前向声明来消除对 ALTER 语句的需要。)
  • @MT0 非常感谢,例子很清楚,我在找什么

标签: sql oracle object-relational-model


【解决方案1】:

您不需要为子类型声明嵌套表(并且可以使用类型的前向声明来摆脱所有ALTER 语句):

CREATE TYPE DIPENDENTE_TY AS OBJECT(
    NOME VARCHAR2(20),
    CF CHAR(16),
    DATAN DATE
) NOT FINAL;

CREATE TYPE AMMINISTRATORE_TY UNDER DIPENDENTE_TY();

CREATE TYPE MEDICO_TY;

CREATE TYPE PAZIENTE_TY;

CREATE TYPE VISITA_TY AS OBJECT(
    DATA DATE,
    TIPO VARCHAR2(20),
    TICKET INTEGER,
    DIP REF PAZIENTE_TY,
    DIM REF MEDICO_TY
);

CREATE TYPE COLL_REF_VISITA_TY AS TABLE OF REF VISITA_TY;

CREATE TYPE MEDICO_TY UNDER DIPENDENTE_TY(
    SPECIALITA VARCHAR2(20),
    REPARTO VARCHAR2(20),
    VISITATO COLL_REF_VISITA_TY,
    MEMBER PROCEDURE INSERISCI_VISITA(
      PAZIENTE VARCHAR,
      DATAV DATE,
      TIPOV VARCHAR2,
      TICKET INTEGER
    )
);

CREATE TYPE PAZIENTE_TY AS OBJECT(
    CF CHAR(16),
    NOME VARCHAR2(20),
    COGNOME VARCHAR2(20),
    FA_VISITA COLL_REF_VISITA_TY
);

CREATE TABLE DIPENDENTE_TAB OF DIPENDENTE_TY;

CREATE TABLE PAZIENTE_TAB OF PAZIENTE_TY
NESTED TABLE FA_VISITA STORE AS VISITE_PAZIENTE_TAB;

CREATE TABLE VISITA_TAB OF VISITA_TY(
  DIP SCOPE IS PAZIENTE_TAB,        
  DIM SCOPE IS DIPENDENTE_TAB
);

ALTER TABLE VISITE_PAZIENTE_TAB
  ADD SCOPE FOR ( COLUMN_VALUE ) IS VISITA_TAB;

然后就可以创建数据了:

INSERT INTO visita_tab VALUES ( VISITA_TY( SYSDATE, 'tipo1', 1, NULL, NULL ) );
INSERT INTO visita_tab VALUES ( VISITA_TY( SYSDATE, 'tipo2', 2, NULL, NULL ) );
INSERT INTO visita_tab VALUES ( VISITA_TY( SYSDATE, 'tipo3', 3, NULL, NULL ) );

INSERT INTO DIPENDENTE_TAB VALUES (
  MEDICO_TY(
    'nome',
    'cf______________',
    SYSDATE,
    'specialita',
    'reparto',
    COLL_REF_VISITA_TY(
      ( SELECT REF(v) FROM  visita_tab v WHERE ticket = 1 ),
      ( SELECT REF(v) FROM  visita_tab v WHERE ticket = 2 )
    )
  )
);

INSERT INTO visita_tab VALUES (
  VISITA_TY(
    SYSDATE,
    'tipo4',
    4,
    NULL,
    ( SELECT TREAT(REF(m) AS REF MEDICO_TY)
      FROM dipendente_tab m
      WHERE nome = 'nome'
      AND   VALUE(m) IS OF ( MEDICO_TY )
    )
  )
);

MEDICO_TY 值存储在DIPENDENTE_TAB 中,无需为子类型中定义的集合创建嵌套表。

您可以使用以下方法获取数据:

SELECT data,
       tipo,
       ticket,
       v.dim.nome,
       v.dim.cf,
       v.dim.datan,
       v.dim.specialita,
       v.dim.reparto,
       dv.column_value.tipo
FROM   visita_tab v
       OUTER APPLY v.dim.VISITATO dv;

db小提琴here

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多