Oracle Object-Relational - 有没有办法声明子类型的嵌套 table?
Oracle Object-Relational - Is there a way to declare a nested table of a subtype?
类型声明:
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 嵌套 table,但它是 Dipendente_ty 的子类型,所以我只有 table 类型的实例Dipendente_ty。如何仅为 Medico_ty 个实例声明嵌套 table?
编辑
当我尝试为 Dipendente_ty 定义 table 时出现以下错误:
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
您无需为子类型声明嵌套的 table(并且可以使用类型的前向声明来摆脱所有 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
中,不需要为子类型中定义的集合嵌套 table。
您可以使用以下方法获取数据:
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<>fiddle here
类型声明:
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 嵌套 table,但它是 Dipendente_ty 的子类型,所以我只有 table 类型的实例Dipendente_ty。如何仅为 Medico_ty 个实例声明嵌套 table?
编辑 当我尝试为 Dipendente_ty 定义 table 时出现以下错误:
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
您无需为子类型声明嵌套的 table(并且可以使用类型的前向声明来摆脱所有 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
中,不需要为子类型中定义的集合嵌套 table。
您可以使用以下方法获取数据:
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<>fiddle here