Oracle系列:記錄(Record)
一,什么是記錄(Record)? 由單行多列的標量構成的復合結構。可以看做是一種用戶自定義數(shù)據(jù)類型。組成類似于多維數(shù)組。 將一個或多個標量封裝成一個對象進行操作。是一種臨時復合對象類型。 記錄可以直接賦值。RECORD1 :=RECORD2; 記錄不可以整體比較. 記錄不可以整體判斷為空。 二,%ROWTYPE和記錄(Record)? 請區(qū)別%ROWTYPE和記錄(Record)類型。%ROWTYPE可以說是Record的升級簡化版。 區(qū)別在與前者結構為表結構,后者為自定義結構。二者在使用上沒有很大區(qū)別。前者方便,后者靈活。在實際中根據(jù)情況來具體決定使用。 Record + PL/SQL表可以進行數(shù)據(jù)的多行多列存儲。 三,如何創(chuàng)建和使用記錄? ①創(chuàng)建記錄類型 語法: TYPE 記錄名 IS RECORD ( filed1 type1 [NOT NULL] [:=eXPr1], ....... , filedN typen [NOT NULL] [:=exprn] ) 其中,filed1是標量的名字。 ②聲明記錄類型變量: 記錄類型變量名 記錄類型 ③填充記錄。 ④訪問記錄成員 記錄類型變量名.filed1 ......... 記錄類型變量名.filedN 注意: 表字段類型修改后,還需要修改記錄字段類型,有時候可能會忘記,從而出現(xiàn)錯誤。 對于記錄內(nèi)每個字段(filed1.。。。),可以指定也可以使用%TYPE和%ROWTYPE動態(tài)指定記錄字段類型。
好處是表字段發(fā)生變化,記錄字段自動改變。但是,由于每次執(zhí)行前,遇到%TYPR或%ROWTYPE, 數(shù)據(jù)庫系統(tǒng)都會去查看對應表字段類型,會造成一定的數(shù)據(jù)庫開銷,如果系統(tǒng)中大量使用記錄類型,則對性能會有一定影響。 另外如果刪除了某一字段,而自定義記錄中使用了該字段,也會有可能忘記刪除該字段。 對數(shù)據(jù)庫負荷偏低的系統(tǒng),性能問題一般可以不重點關注,但是對于高負荷數(shù)據(jù)庫服務器, 各個環(huán)節(jié)都要考慮性能問題,每處節(jié)省一點出來,性能整體就有很大提高。 語法: 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動態(tài)指定記錄字段。 /*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; 例子:數(shù)據(jù)集中的記錄和記錄類型中的數(shù)據(jù)關系。 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; / 四,使用記錄向表中插入數(shù)據(jù)? 根據(jù)表結構合理安排記錄字段。比如主外鍵。 如果用記錄(RECORD)插入數(shù)據(jù),那么只能使用記錄成員; 如果用%ROWTYPE插入數(shù)據(jù),可以直接使用%ROWTYPE。 例子:使用記錄成員向表中插入數(shù)據(jù) 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); Insert InTo empa values EmpRec; --實現(xiàn)記錄插入
Select EMPNO, ENAME, JOB InTo EmpRec From empa Where empa.EMPNO = '1001'; DBMS_OUTPUT.PUT_LINE(EmpRec.RENO||' '||EmpRec.RENAME||' '||EmpRec.RJOB); End; 五,使用記錄更新數(shù)據(jù)? 如果用記錄(RECORD)更新數(shù)據(jù),那么只能使用記錄成員; 如果用%ROWTYPE更新數(shù)據(jù),可以直接使用%ROWTYPE。 例子:使用%ROWTYPE向表中插入數(shù)據(jù) DECLARE vEmp empa%RowType; Begin Select * InTo vEmp From empa Where empa.EMPNO = '7369'; UpDate empa Set ROW = vEmp Where EMPNO = 1001; End;
六,使用記錄刪除數(shù)據(jù)? 刪除記錄時,只能在delete語句的where子句中使用記錄成員。
|