【问题标题】:Oracle SQL create identity column in nested tableOracle SQL 在嵌套表中创建标识列
【发布时间】:2020-11-12 02:27:54
【问题描述】:

我正在制作一个包含嵌套表格的表格:

create DOCUMENT as OBJECT (
    DOC_ID NUMBER,
    DESCRIPTION VARCHAR(1000));   

create type documents_t is table of DOCUMENT;

create table projects (
    ID NUMBER GENERATED ALWAYS AS IDENTITY ,
    DOCUMENTS documents_t)
    NESTED TABLE DOCUMENTS STORE AS documents_nested(
        (PRIMARY KEY(nested_table_id, DOC_ID)) ORGANIZATION INDEX);

这工作正常,但我似乎无法找到如何将嵌套表的主键作为标识列。有什么建议? 谢谢

【问题讨论】:

  • 您是否只是在寻找将嵌套表 id 设置为“身份列”的解决方案?
  • 是的,我需要嵌套表中的主键列(列“DOC_ID”)也是标识列。
  • 我的意思是我找不到这样的可能性。我们也可以通过用户定义的构造函数和使用序列来实现相同的目的。如果你愿意,我可以举一个例子。
  • 你的意思是同时使用构造函数和序列吗?还是我只能用构造函数来做?
  • 谢谢你,我很高兴看到一个例子

标签: sql oracle nested-table


【解决方案1】:

请找到代码sn-p,

CREATE SEQUENCE seq_documents
 START WITH     1
 INCREMENT BY   1
 NOCACHE
 NOCYCLE;

CREATE OR REPLACE TYPE documents_q AS OBJECT
(
   doc_id      NUMBER,
   description VARCHAR2(1000),
   CONSTRUCTOR FUNCTION documents_q(p_description VARCHAR2) RETURN SELF AS RESULT
);

CREATE OR REPLACE TYPE BODY documents_q AS
   CONSTRUCTOR FUNCTION documents_q(p_description VARCHAR2) RETURN SELF AS RESULT IS
   BEGIN
      self.doc_id      := seq_documents.nextval;
      self.description := p_description;
      RETURN;
   END;
END;
/

CREATE TYPE documents_t AS TABLE OF documents_q;

create table projects (
    id NUMBER GENERATED ALWAYS AS IDENTITY ,
    documents documents_t)
    NESTED TABLE documents STORE AS documents_nested(
        (PRIMARY KEY(nested_table_id, doc_id))  ORGANIZATION INDEX);

INSERT INTO PROJECTS(documents) VALUES (documents_t(documents_q('Description One'),documents_q('Description Two')));
        
SELECT * FROM projects;

如果它能给你解决方案,请告诉我。谢谢

【讨论】:

  • 非常感谢您提供的示例。它确实有效。虽然我希望 Oracle 能够让它变得更简单。
  • 这是我的荣幸:)。是的,我们应该继续寻找 Oracle 中是否已经有任何此类解决方案可用,并将在此处更新。
【解决方案2】:

如果您想要另一个没有构造函数的解决方案(因为使用构造函数会增加更多维护)

我采用了@Sujitmohanty30 的想法并在插入语句中使用了序列。它使代码更易于维护,但会强制您在插入时使用序列并在每个查询中插入一项(因为“sequence.nextval”不会在同一查询中递增):

CREATE SEQUENCE documents_seq NOCACHE;
/
CREATE TYPE document_type AS OBJECT (
   doc_id      NUMBER,
   description VARCHAR2(1000)
);
/
CREATE TYPE documents AS TABLE OF document_type;
/
create table projects_docs (
    id NUMBER GENERATED ALWAYS AS IDENTITY ,
    docs documents)
    NESTED TABLE docs STORE AS docs_nested(
        (PRIMARY KEY(nested_table_id, doc_id)) ORGANIZATION INDEX); 
 /
INSERT INTO projects_docs (docs) VALUES(
    documents(document_type(documents_seq.nextval, 'doc')));
/
select p.id, d.* from projects_docs p, table(p.docs) d;

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 2019-10-02
    • 2020-08-09
    • 2021-11-09
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多