熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle復合變量之RECORD

2022-06-13   來源: Oracle 

  CREATE OR REPLACE PROCEDURE TEST_RECORD

  AS

  TYPE user_record_type IS RECORD(

  id usersid%TYPE

  login_id userslogin_id%TYPE

  name usersname%TYPE);

  u_r_t user_record_type;

  BEGIN

  FOR recd IN (SELECT * FROM users) LOOP

  SELECT idlogin_idname INTO u_r_t FROM users WHERE id=recdid;

  dbms_outputput_line(ID: ||u_r_tid ||    LOGIN_ID: ||u_r_tlogin_id||    NAME: ||u_r_tname);

  END LOOP;

  NULL;

  END;

  一什麼是記錄(Record)?

  由單行多列的標量構成的復合結構可以看做是一種用戶自定義數據類型組成類似於多維數組

  將一個或多個標量封裝成一個對象進行操作是一種臨時復合對象類型

  記錄可以直接賦值RECORD :=RECORD

  記錄不可以整體比較

  記錄不可以整體判斷為空

  二%ROWTYPE和記錄(Record)?

  請區別%ROWTYPE和記錄(Record)類型%ROWTYPE可以說是Record的升級簡化版

  區別在與前者結構為表結構後者為自定義結構二者在使用上沒有很大區別前者方便後者靈活在實際中根據情況來具體決定使用

  Record + PL/SQL表可以進行數據的多行多列存儲

  三如何創建和使用記錄?

  ①創建記錄類型

  語法

  TYPE  記錄名  IS RECORD

  (

  filed type [NOT NULL] [=eXPr]

  

  filedN typen [NOT NULL] [=exprn]

  )

  其中filed是標量的名字

  ②聲明記錄類型變量

  記錄類型變量名 記錄類型

  ③填充記錄

  ④訪問記錄成員

  記錄類型變量名filed

  

  記錄類型變量名filedN

  注意

  表字段類型修改後還需要修改記錄字段類型有時候可能會忘記從而出現錯誤

  對於記錄內每個字段(filed可以指定也可以使用%TYPE和%ROWTYPE動態指定記錄字段類型

  好處是表字段發生變化記錄字段自動改變但是由於每次執行前遇到%TYPR或%ROWTYPE

  數據庫系統都會去查看對應表字段類型會造成一定的數據庫開銷如果系統中大量使用記錄類型則對性能會有一定影響

  另外如果刪除了某一字段而自定義記錄中使用了該字段也會有可能忘記刪除該字段

  對數據庫負荷偏低的系統性能問題一般可以不重點關注但是對於高負荷數據庫服務器

  各個環節都要考慮性能問題每處節省一點出來性能整體就有很大提高

  語法

  TYPE  記錄名  IS RECORD

  (

  filed tableFiled%Type [NOT NULL] [=eXPr]

  filed tableFiled%Type [NOT NULL] [=eXPr]

  

  filedn tableFiled%Type [NOT NULL] [=exprn]

  );

  例子記錄可以整體賦值

  Declare

  Type EmpType is Record(

  EMPNO number()

  ENAME  varchar()

  JOB varchar()

  SAL number()

  DEPTNO number()

  );

  EmpRec  EmpType;

  EmpRec  EmpType;

  Begin

  EmpRecEmpno:=;

  EmpRecEname:=SMITH;

  EmpRecJob:=CLERK;

  EmpRecSal:=;

  EmpRecDeptno:=;

  EmpRec := EmpRec;

  DBMS_outputput_line(EmpRecempno);

  End;

  例子記錄不可以整體比較只可以比較記錄字段

  Declare

  Type EmpType is Record(

  EMPNO number()

  ENAME  varchar()

  JOB varchar()

  SAL number()

  DEPTNO number()

  );

  EmpRec  EmpType;

  EmpRec  EmpType;

  Begin

  EmpRecEmpno:=;

  EmpRecEname:=SMITH;

  EmpRecJob:=CLERK;

  EmpRecSal:=;

  EmpRecDeptno:=;

  if EmpRecsal < EmpRecsal then

  DBMS_outputput_line(Xiao Xiao Xiao);

  end if;

  End;

  例子記錄不可以整體判斷為空只可以判斷記錄字段

  Declare

  Type EmpType is Record(

  EMPNO number()

  ENAME  varchar()

  JOB varchar()

  SAL number()

  DEPTNO number()

  );

  EmpRec  EmpType;

  Begin

  if EmpRecename is null then

  DBMS_outputput_line(Kong Kong Kong);

  end if;

  End;

  例子使用%TYPE和%ROWTYPE動態指定記錄字段

  DECLARE

  Type MyRecType Is  Record

  (

  RENO  EMPAEMPNO%Type

  RENAME   EMPAENAME%Type

  RJOB   EMPAJOB%Type

  );

  EmpRec  MyRecType;

  Begin

  Select   EMPNO ENAME JOB  InTo  EmpRec  From empa Where empaEMPNO = ;

  If  EmpRecRJOB  = CLERK  Then

  DBMS_OUTPUTPUT_LINE(Name: ||EmpRecRENAME);

  End If;

  End;

  例子數據集中的記錄和記錄類型中的數據關系

  DECLARE

  Type MyRecType Is  Record

  (

  RENO  EMPAEMPNO%Type

  RENAME   EMPAENAME%Type

  RJOB   EMPAJOB%Type

  );

  EmpRec  MyRecType;

  vJob  EMPAJOB%Type;

  Begin

  Select   EMPNO ENAME JOB  InTo  EmpRec  From empa Where empaEMPNO = ;

  DBMS_OUTPUTPUT_LINE(MyRecTypeRJOB: ||EmpRecRJOB);

  EmpRecRJOB  := 修改值後  ;

  DBMS_OUTPUTPUT_LINE(MyRecTypeRJOB: ||EmpRecRJOB);

  Select JOB  InTo vJob  from empa  Where empaEMPNO = EmpRecRENO;

  DBMS_OUTPUTPUT_LINE(EMPAJOB: ||vJob);

  End;

  /

  四使用記錄向表中插入數據?

  根據表結構合理安排記錄字段比如主外鍵

  如果用記錄(RECORD)插入數據那麼只能使用記錄成員

  如果用%ROWTYPE插入數據可以直接使用%ROWTYPE

  例子使用記錄成員向表中插入數據

  DECLARE

  Type MyRecType Is  Record

  (

  RENO  EMPAEMPNO%Type

  RENAME   VARCHAR()

  RJOB   EMPAJOB%Type

  );

  EmpRec MyRecType;

  Begin

  Select   EMPNO ENAME JOB  InTo  EmpRec  From empa Where empaEMPNO = ;

  DBMS_OUTPUTPUT_LINE(EmpRecRENO||  ||EmpRecRENAME||  ||EmpRecRJOB);

  EmpRecRENO  := ;

  EmpRecRENAME := 傑克;

  EmpRecRJOB  := 辦事員;

  Insert InTo  empa(EMPNOENAMEJOB)  Values(EmpRecRENO EmpRecRENAMEEmpRecRJOB);

  Select  EMPNO ENAME JOB  InTo  EmpRec  From empa Where empaEMPNO = ;

  DBMS_OUTPUTPUT_LINE(EmpRecRENO||  ||EmpRecRENAME||  ||EmpRecRJOB);

  End;

  五使用記錄更新數據?

  如果用記錄(RECORD)更新數據那麼只能使用記錄成員

  如果用%ROWTYPE更新數據可以直接使用%ROWTYPE

  例子使用%ROWTYPE向表中插入數據

  DECLARE

  vEmp empa%RowType;

  Begin

  Select  *  InTo  vEmp  From empa Where empaEMPNO = ;

  UpDate empa Set ROW = vEmp Where EMPNO = ;

  End;

  六使用記錄刪除數據?

  刪除記錄時只能在delete語句的where子句中使用記錄成員


From:http://tw.wingwit.com/Article/program/Oracle/201311/17783.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.