簡體   English   中英

Oracle OR-如何保證嵌套表具有對超類型的所有子類型的引用

[英]Oracle OR - how to guarantee that a nested table has references to all the subtypes of a supertype

我正在設計一個對象關系模型數據庫。 我有一個名為“ topico_t”的超類型,以及該超類型的4個子類型,分別為“ anotacao_t”,“ tarefa_t”,“ memo_t”和“ contacto_t”。 參見此處的DDL代碼段

CREATE OR REPLACE TYPE categoria_t AS OBJECT(
 nome    VARCHAR2(25),
 pai     REF categoria_t
);

CREATE OR REPLACE TYPE categoria_tab_t AS TABLE OF REF categoria_t;

CREATE OR REPLACE TYPE topico_t AS OBJECT(
 titulo VARCHAR2(100),
 ultimaAlteracao DATE,
 categorias categoria_tab_t
 --referencias topico_tab_t
) NOT FINAL;

CREATE OR REPLACE TYPE topico_tab_t AS TABLE OF REF topico_t;

ALTER TYPE topico_t ADD ATTRIBUTE referencias topico_tab_t CASCADE;

CREATE OR REPLACE TYPE periodo_t AS OBJECT(
 inicio  DATE,
 fim     DATE
);

CREATE OR REPLACE TYPE repeticao_t AS OBJECT(
 frequencia  VARCHAR2(10), 
 duracao     periodo_t
);

CREATE OR REPLACE TYPE anotacao_t UNDER topico_t(
 periodo periodo_t,
 repeticao repeticao_t
);


CREATE OR REPLACE TYPE telefone_t AS OBJECT(
 numero  VARCHAR2(25)
);

CREATE OR REPLACE TYPE telefone_tab_t AS TABLE OF telefone_t;

CREATE OR REPLACE TYPE morada_t AS OBJECT(
 rua     VARCHAR2(100),
 localidade  VARCHAR2(50),
 codigoPostal VARCHAR2(10)
);

CREATE OR REPLACE TYPE morada_tab_t AS TABLE OF morada_t;

CREATE OR REPLACE TYPE contacto_t UNDER topico_t(
 telefones telefone_tab_t,
 moradas   morada_tab_t,
 email     VARCHAR2(100),
 url       VARCHAR2(150)
);

CREATE OR REPLACE TYPE tarefa_t UNDER topico_t(
 dataFim       DATE,
 completo  NUMBER(1,0),
 conteudo  VARCHAR2(255)
);

CREATE OR REPLACE TYPE memo_t UNDER topico_t(
 conteudo VARCHAR2(255)
);


CREATE TABLE categorias OF categoria_t;


CREATE TABLE topicos OF topico_t
 NESTED TABLE categorias STORE AS categorias_nested
 NESTED TABLE referencias STORE AS referencias_nested;

所以,然后我用這個填充表“ topicos”:

  INSERT INTO topicos VALUES (tarefa_t(
  'Dissertacao',
  TO_DATE('2018/02/13', 'YYYY/MM/DD'),
  categoria_tab_t((select ref(c) from categorias c where nome='FEUP')),
  topico_tab_t((select ref(t) from topicos t where titulo='Diogo Pereira'), -- which is an object of the subtype "contacto_t"
  (select ref(t) from topicos t where titulo='Comecar a dissertacao'), -- which is an object of the subtype "memo_t"
  (select ref(t) from topicos t where titulo='Apresentar Dissertacao'), -- which is an object of the subtype "tarefa_t"
  (select ref(t) from topicos t where titulo='Reuniao com Orientador da Dissertacao')), -- which is an object of the subtype "anotacao_t"
  TO_DATE('2018/08/13', 'YYYY/MM/DD'),
  0,
  'Dissertacao all over again'));

因此,我必須構建一個查詢甚至一個PL / SQL塊,該查詢將返回表“ topicos”的所有行,該表至少在嵌套表“ referencias”中包含上述4個子類型的一個實例對象以上。 理想情況下,此查詢將返回該行(在上面的INSERT中提到)。

致以最誠摯的問候,並希望您過得愉快! ;)

您的DDL代碼有誤。 您正在創建基本類型topico_t ,然后在該類型下創建一些子類型,但是僅在創建一個基本類型對象的表。 這樣做的問題是,您期望該表保存任何子類型的對象,但由於所謂的對象切片 ,情況並非如此。 您創建的表僅包含與您為基本類型定義的字段相對應的列。

因此,您需要為最終將實例化的所有子類型創建表。 只有在可以實例化該基本類型的情況下(即,如果可能存在不屬於任何子類型的基本類型的對象),才應該為該基本類型創建一個表。

完成此操作后,您要編寫的查詢應使用函數TREAT。 請注意,根據文檔 ,當表達式的類型不是您要強制轉換為的類型時,此函數將返回NULL ,因此,您需要編寫的查詢應該與測試是否至少有一行包含一個從嵌套表中選擇並嘗試轉換為您創建的每個子類型時的非null結果字段。 檢查文檔上的示例以了解如何使用此功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM