Oracle系列:記錄Record

來源:互聯網
上載者:User

Oracle系列:記錄(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子句中使用記錄成員。

下一文:Oracle系列:PL/SQL表

有問題或指正請聯絡:qfs_v@qq.com 謝謝!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.