kxbin
          成功留給有準備的人
          posts - 10,  comments - 35,  trackbacks - 0
          pl/sql表和記錄一樣,都是用戶自定義的數據結構。record類似于c語言中結構(struct)而pl/sql表類似于c語言的數組或集合,只是這個數據的元素可以是用戶自定義的類型。record可以存儲一條記錄,而pl/sql表可以存儲多條record記錄。
          一,什么是記錄(Record)?
           由單行多列的標量構成的復合結構。可以看做是一種用戶自定義數據類型。組成類似于多維數組。
          將一個或多個標量封裝成一個對象進行操作。是一種臨時復合對象類型。
           
           記錄可以直接賦值。RECORD1 :=RECORD2;
           記錄不可以整體比較.
           記錄不可以整體判斷為空。
           
          二,%ROWTYPE和記錄(Record)?
           請區別%ROWTYPE和記錄(Record)類型。%ROWTYPE可以說是Record的升級簡化版。
           區別在與前者結構為表結構,后者為自定義結構。二者在使用上沒有很大區別。前者方便,后者靈活。在實際中根據情況來具體決定使用。
           Record + PL/SQL表可以進行數據的多行多列存儲。
           
          三,如何創建和使用記錄?
           
            ①創建記錄類型
            語法:
            TYPE  記錄名  IS RECORD 
            ( 
             filed1 type1 [NOT NULL] [:=eXPr1],
                 ....... ,
              filedN typen [NOT NULL] [:=exprn] 
            )
            其中,filed1是標量的名字。
            
            ②聲明記錄類型變量:
             記錄類型變量名 記錄類型
             
            ③填充記錄。
             
            ④訪問記錄成員
             記錄類型變量名.filed1
             .........
             記錄類型變量名.filedN
             
             
            注意:
            表字段類型修改后,還需要修改記錄字段類型,有時候可能會忘記,從而出現錯誤。
            對于記錄內每個字段(filed1.。。。),可以指定也可以使用%TYPE和%ROWTYPE動態指定記錄字段類型。 
            好處是表字段發生變化,記錄字段自動改變。但是,由于每次執行前,遇到%TYPR或%ROWTYPE,
            數據庫系統都會去查看對應表字段類型,會造成一定的數據庫開銷,如果系統中大量使用記錄類型,則對性能會有一定影響。
            另外如果刪除了某一字段,而自定義記錄中使用了該字段,也會有可能忘記刪除該字段。
                 對數據庫負荷偏低的系統,性能問題一般可以不重點關注,但是對于高負荷數據庫服務器,
                 各個環節都要考慮性能問題,每處節省一點出來,性能整體就有很大提高。
            
            語法:
            TYPE  記錄名  IS RECORD 
            ( 
             filed1 table.Filed%Type [NOT NULL] [:=eXPr1] ,
             filed2 table.Filed%Type [NOT NULL] [:=eXPr1] ,
                 ....... ,
              filedn table.Filed%Type [NOT NULL] [:=exprn] 
            );
           
           例子:記錄可以整體賦值
           /*conn scott/tiger
           Create Table  empa  As  Select * From emp;
           */
           Declare
               Type EmpType is Record(
                  EMPNO number(4),
                  ENAME  varchar2(10),
                  JOB varchar2(15),
                  SAL number(7,2),
                  DEPTNO number(2)
               );
             EmpRec1  EmpType;
             EmpRec2  EmpType;
           Begin
             EmpRec1.Empno:=7369;
             EmpRec1.Ename:='SMITH';
             EmpRec1.Job:='CLERK';
             EmpRec1.Sal:=800;
             EmpRec1.Deptno:=10;
             EmpRec2 := EmpRec1;
             DBMS_output.put_line(EmpRec2.empno);
           End;
           例子:記錄不可以整體比較,只可以比較記錄字段
           Declare
               Type EmpType is Record(
                  EMPNO number(4),
                  ENAME  varchar2(10),
                  JOB varchar2(15),
                  SAL number(7,2),
                  DEPTNO number(2)
               );
             EmpRec1  EmpType;
             EmpRec2  EmpType;
           Begin
             EmpRec1.Empno:=7369;
             EmpRec1.Ename:='SMITH';
             EmpRec1.Job:='CLERK';
             EmpRec1.Sal:=800;
             EmpRec1.Deptno:=10;
             if EmpRec1.sal < EmpRec2.sal then
               DBMS_output.put_line('Xiao Xiao Xiao');
             end if;
           End;
           
           例子:記錄不可以整體判斷為空,只可以判斷記錄字段。
           Declare
               Type EmpType is Record(
                  EMPNO number(4),
                  ENAME  varchar2(10),
                  JOB varchar2(15),
                  SAL number(7,2),
                  DEPTNO number(2)
               );
             EmpRec  EmpType;
           Begin
             if EmpRec.ename is null then
               DBMS_output.put_line('Kong Kong Kong');  
             end if;
           End;
           
           例子:使用%TYPE和%ROWTYPE動態指定記錄字段。
           /*conn scott/tiger
           Create Table  empa  As  Select * From emp;
           */
           DECLARE
            Type MyRecType Is  Record
            (
             RENO  EMPA.EMPNO%Type,
             RENAME   EMPA.ENAME%Type,
             RJOB   EMPA.JOB%Type
            );
            EmpRec  MyRecType;
           Begin
            Select   EMPNO, ENAME, JOB  InTo  EmpRec  From empa Where empa.EMPNO = '7369';
            If  EmpRec.RJOB  = 'CLERK'  Then
             DBMS_OUTPUT.PUT_LINE('Name: '||EmpRec.RENAME);
            End If;
           End;
           
           例子:數據集中的記錄和記錄類型中的數據關系。
           DECLARE
            Type MyRecType Is  Record
            (
             RENO  EMPA.EMPNO%Type,
             RENAME   EMPA.ENAME%Type,
             RJOB   EMPA.JOB%Type
            );
            EmpRec  MyRecType;
            vJob  EMPA.JOB%Type;
           Begin
            Select   EMPNO, ENAME, JOB  InTo  EmpRec  From empa Where empa.EMPNO = '7369';
            DBMS_OUTPUT.PUT_LINE('MyRecType.RJOB: '||EmpRec.RJOB);
            EmpRec.RJOB  := '修改值后'  ;
            DBMS_OUTPUT.PUT_LINE('MyRecType.RJOB: '||EmpRec.RJOB);
            Select JOB  InTo vJob  from empa  Where empa.EMPNO = EmpRec.RENO;
            DBMS_OUTPUT.PUT_LINE('EMPA.JOB: '||vJob);
           End;
           /
           
           
          四,使用記錄向表中插入數據?
           根據表結構合理安排記錄字段。比如主外鍵。
           如果用記錄(RECORD)插入數據,那么只能使用記錄成員;
           如果用%ROWTYPE插入數據,可以直接使用%ROWTYPE。
           
           例子:使用記錄成員向表中插入數據
           DECLARE
            Type MyRecType Is  Record
            (
             RENO  EMPA.EMPNO%Type,
             RENAME   VARCHAR2(10),
             RJOB   EMPA.JOB%Type
            );
            EmpRec MyRecType; 
           Begin
            Select   EMPNO, ENAME, JOB  InTo  EmpRec  From empa Where empa.EMPNO = '7369';
            DBMS_OUTPUT.PUT_LINE(EmpRec.RENO||'  '||EmpRec.RENAME||'  '||EmpRec.RJOB);
            
            EmpRec.RENO  := 1001;
            EmpRec.RENAME := '杰克';
            EmpRec.RJOB  := '辦事員';
            Insert InTo  empa(EMPNO,ENAME,JOB)  Values(EmpRec.RENO, EmpRec.RENAME,EmpRec.RJOB);
           
            Select  EMPNO, ENAME, JOB  InTo  EmpRec  From empa Where empa.EMPNO = '1001';
            DBMS_OUTPUT.PUT_LINE(EmpRec.RENO||'  '||EmpRec.RENAME||'  '||EmpRec.RJOB);
           End;
           
          五,使用記錄更新數據?
           如果用記錄(RECORD)更新數據,那么只能使用記錄成員;
           如果用%ROWTYPE更新數據,可以直接使用%ROWTYPE。
           
           例子:使用%ROWTYPE向表中插入數據
           DECLARE
            vEmp empa%RowType;
           Begin
            Select  *  InTo  vEmp  From empa Where empa.EMPNO = '7369';
            UpDate empa Set ROW = vEmp Where EMPNO = 1001;
           End;
          六,使用記錄刪除數據?
           刪除記錄時,只能在delete語句的where子句中使用記錄成員。 
          posted on 2012-09-05 21:52 kxbin 閱讀(353) 評論(0)  編輯  收藏 所屬分類: ORACLE轉發
          你恨一個人是因為你愛他;你喜歡一個人,是因為他身上有你沒有的;你討厭一個人是因為他身上有你有的東西;你經常在別人面前批評某人,其實潛意識中是想接近他。

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(5)

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          J2EE

          java技術網站

          Linux

          平時常去的網站

          數據庫

          電影網站

          網站設計

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 绥阳县| 航空| 阿巴嘎旗| 宕昌县| 惠水县| 宿州市| 喀喇| 龙州县| 通化市| 长丰县| 黄梅县| 威海市| 望城县| 华安县| 梁山县| 福建省| 大洼县| 乌鲁木齐市| 沙洋县| 明溪县| 潜山县| 双城市| 大化| 保靖县| 同江市| 丹棱县| 金湖县| 泸西县| 东乌珠穆沁旗| 教育| 如东县| 台北县| 青阳县| 壤塘县| 宁强县| 财经| 隆德县| 阿尔山市| 定陶县| 郓城县| 云浮市|