1. <var id="fe6gj"></var>

    <rp id="fe6gj"><nav id="fe6gj"></nav></rp>

    <noframes id="fe6gj"><cite id="fe6gj"></cite>

    <ins id="fe6gj"><button id="fe6gj"><p id="fe6gj"></p></button></ins>
    1. <tt id="fe6gj"><i id="fe6gj"><sub id="fe6gj"></sub></i></tt>
        始創于2000年 股票代碼:831685
        咨詢熱線:0371-60135900 注冊有禮 登錄
        • 掛牌上市企業
        • 60秒人工響應
        • 99.99%連通率
        • 7*24h人工
        • 故障100倍補償
        您的位置: 網站首頁 > 幫助中心>文章內容

        Oracle提供兩種使用嵌套表

        發布時間:  2012/9/16 15:48:11

        把Oracle嵌套表的其他功能仔細看了看并做了個簡單整理。

        Oracle提供兩種使用嵌套表的方法:
        1. PL/SQL代碼中作為擴展PL/SQL語言;(這部分內容就是上邊所說Oracle內存表是oracle嵌套表的部分功能)
        2. 作為物理存儲機制,以持久地存儲集合。

        */

        --創建測試表:

        CREATE TABLE dept-
         

          (deptno NUMBER(2) PRIMARY KEY,
           dname VARCHAR2(14),
           loc VARCHAR2(13)
          );
          
        CREATE TABLE emp
          (empno NUMBER(4) PRIMARY KEY,
           ename VARCHAR2(10),
           job VARCHAR2(9),
           mgr NUMBER(4) REFERENCES emp,
           hiredate DATE,
           sal NUMBER(7,2),
           comm NUMBER(7,2),
           deptno NUMBER(2) REFERENCES dept
          );
          
        INSERT INTO dept SELECT * FROM scott.dept;
        INSERT INTO emp SELECT * FROM scott.emp;

        --創建type

        CREATE OR REPLACE TYPE emp_type AS OBJECT
          (empno NUMBER(4),
           ename VARCHAR2(10),
           job VARCHAR2(9),
           mgr NUMBER(4),
           hiredate DATE,
           sal NUMBER(7,2),
           comm NUMBER(7,2)
          );
          
        CREATE OR REPLACE TYPE emp_tab_type AS TABLE OF emp_type;

        --使用嵌套表

        CREATE TABLE dept_and_emp
          (deptno NUMBER(2) PRIMARY KEY,
           dname VARCHAR2(14),
           loc VARCHAR2(13),
           emps emp_tab_type
          )
          NESTED TABLE emps STORE AS emps_nest;

        --可以在嵌套表上增加約束(這里我們先不執行此步驟,等做完下一步測試我們再創建約束)
        --ALTER TABLE emps_nt ADD CONSTRAINT emps_empno_unique
        --嵌套表不支持參照完整性約束,不能參考任何其他表甚至自己
        --給嵌套表增加數據,我們看看這兩種方式的結果有何不同
        方式1:INSERT INTO
          dept_and_emp
          SELECT dept.*,
           CAST(
          MULTISET( SELECT empno, ename, job, mgr, hiredate, sal,
          comm
           FROM
          emp
           WHERE emp.deptno
          = dept.deptno ) AS emp_tab_type )
           FROM
          dept;
        --Oracle同樣提供方法去掉集合的嵌套,像關系型表一樣處理(能夠將EMPS列當作一個表,并自然連接且不需要連接條件):
        SELECT d.deptno, d.dname, emp.* FROM dept_and_emp D, TABLE(d.emps) emp;
        --這里執行看到結果是14條數據

        delete from dept_and_emp;

        方式2:INSERT INTO dept_and_emp
        SELECT dept.*, CAST(MULTISET( SELECT empno, ename, job, mgr, hiredate, sal, comm
          FROM
          emp,dept
           WHERE emp.deptno
          = dept.deptno ) AS emp_tab_type ) from dept;

        SELECT d.deptno, d.dname, emp.* FROM dept_and_emp D, TABLE(d.emps) emp;
        --這里執行看到結果是56條數據,顯然是錯誤的

        --第一個是按照where等連接條件符合的某一個dept的emp表的數據作為一個集合存儲,而第二個沒有任何關聯條件,就是把所有emp的數據
        --全部作為一個dept的數據存儲,這個寫法顯然是錯誤的,如果我們把剛才講的約束給嵌套表加上,就可以起到防止這種錯誤的功效了。

        --增加約束再執行我們上邊的第二個insert語句將會報錯
        --我們按照上邊第一個insert語句插入數據,繼續我們下邊的測試。

        --按照“每行實際是一張表”的思想來更新:
        UPDATE TABLE( SELECT emps FROM dept_and_emp WHERE deptno = 10) SET comm = 100;

        --插入與刪除的語法:
          INSERT INTO TABLE(SELECT emps FROM dept_and_emp WHERE deptno=10)
          VALUES (1234,'NewEmp','Clerk',7782,SYSDATE,1200,NULL);
          
          DELETE FROM TABLE(SELECT emps FROM dept_and_emp WHERE deptno=20)
          WHERE ename='SCOTT';

        --一般而言,必須總是連接,而不能單獨查詢嵌套表(如emp_nest)中的數據,但是如果確實需要,是可以的。
        --hint NESTED_TABLE_GET_REFS被用于EXP和IMP處理嵌套表。

          SELECT /*+NESTED_TABLE_GET_REFS+*/ NESTED_TABLE_ID, SYS_NC_ROWINFO$ FROM emps_nest;

        --而察看EMPS_NEST的結構看不到NESTED_TABLE_ID,SYS_NC_ROWINFO$兩列。對父表DEPT_AND_EMP來說NESTED_TABLE_ID是一個外鍵。
        --使用這個hint就可以直接操作嵌套表了:
          UPDATE /*+NESTED_TABLE_GET_REFS+*/ emps_nest SET ename=INITCAP(ename);
          
        --嵌套表的存儲:
        --上例中,現實產生了兩張表:
        /*
          DEPT_AND_EMP
          (deptnob NUMBER(2),
          dname VARCHAR2(14),
          loc VARCHAR2(13),
          SYS_NC0000400005$,
        RAW(16))
          
          EMPS_NEST
          (SYS_NC_ROWINFO$,
          NESTED_TABLE_ID,
        RAW(16),
          empno NUMBER(4),
          ename VARCHAR2(10),
          job VARCHAR2(9),
          mgr NUMBER(4),
          hiredate DATE,
          sal NUMBER(7,2),
          comm NUMBER(7,2)) 
        */ 
        --默認情況下,每個嵌套表列都產生一個額外的RAW(16)隱藏列,并在其上創建了唯一約束,用以指向嵌套表。而嵌套表中有兩個
        --隱藏列:SYS_NC_ROWINFO$是作為一個對象返回所有標量元素的一個偽列;另一個NESTED_TABLE_ID的外鍵回指向父表。
        --可以看到真實代碼:
        /*
          CREATE TABLE DEPT_AND_EMP
          (DEPTNO NUMBER(2,0),
           DNAME VARCHAR2(14),
           LOC VARCHAR2(13),
           EMPS EMP_TAB_TYPE)
          PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
          LOGGING STORAGE(INITIAL 131072 NEXT 131072
          MINEXTENTS 1 MAXEXTENTS 4096
          PCTINCREASE 0 FREELISTS 1 FREELIST GROUP 1
          BUFFER_POOL DEFAULT)
          TABLESPACE USER
          NESTED TABLE EMPS
          STORE AS EMPS_NEST
          RETURN BY VALUE;
          
          RETURN BY VALUE用來描述嵌套表如何返回到客戶應用程序中。
          NESTED_TABLE_ID列必須是索引的,那么較好的解決辦法就是使用IOT存儲嵌套表。
          CREATE TABLE DEPT_AND_EMP
          (DEPTNO NUMBER(2,0),
           DNAME VARCHAR2(14),
           LOC VARCHAR2(13),
           EMPS EMP_TAB_TYPE)
          PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
          LOGGING STORAGE(INITIAL 131072 NEXT 131072
          MINEXTENTS 1 MAXEXTENTS 4096
          PCTINCREASE 0 FREELISTS 1 FREELIST GROUP 1
          BUFFER_POOL DEFAULT) TABLESPACE USER
          NESTED TABLE EMPS
          STORE AS EMPS_NEST
          ((empno NOT NULL,
        UNIQUE(empno),
        PRIMARY KEY(nested_table_id,empno))
          ORGANIZATION
          INDEX COMPRESS 1)
          RETURN BY VALUE;
          
          這樣與最初默認的嵌套表相比,使用了較少的存儲空間并有最需要的索引。
          不使用嵌套表作為永久存儲機制的原因
          1.增加了RAW(16)列的額外開銷,父表和子表都將增加這個額外的列;
          2.當通常已經有唯一約束時,父表上的唯一約束是額外開銷;
          3.沒有使用不支持的結構(NESTED_TABLE_GET_REFS),嵌套表不容易使用。
          一般推薦在編程結構和視圖中使用嵌套表。如果要使用嵌套表作為存儲機制,確保嵌套表是IOT,以避免NESTED_TABLE_ID和嵌套表本身中索引的額外開銷。


        本文出自:億恩科技【www.endtimedelusion.com】

        服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]

      1. 您可能在找
      2. 億恩北京公司:
      3. 經營性ICP/ISP證:京B2-20150015
      4. 億恩鄭州公司:
      5. 經營性ICP/ISP/IDC證:豫B1.B2-20060070
      6. 億恩南昌公司:
      7. 經營性ICP/ISP證:贛B2-20080012
      8. 服務器/云主機 24小時售后服務電話:0371-60135900
      9. 虛擬主機/智能建站 24小時售后服務電話:0371-60135900
      10. 專注服務器托管17年
        掃掃關注-微信公眾號
        0371-60135900
        Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權所有  地址:鄭州市高新區翠竹街1號總部企業基地億恩大廈  法律顧問:河南亞太人律師事務所郝建鋒、杜慧月律師   京公網安備41019702002023號
          1
         
         
         
         

        0371-60135900
        7*24小時客服服務熱線

         
         
        av不卡不卡在线观看_最近2018年中文字幕_亚洲欧美一区二区三区_一级A爱做片免费观看国产_日韩在线中文天天更新_伊人中文无码在线