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,數據庫係統都會去查看對應表字段類型,會造成一定的數據庫開銷,如果係統中大量使用記錄類型,則對性能會有一定影響。
③若刪除了某一字段,而自定義記錄中使用了該字段,也會有可能忘記刪除該字段。對數據庫負荷偏低的係統,性能問題一般可以不重點關注,但是對於高負荷數據庫服務器,各個環節都要考慮性能問題,每處節省一點出來,性能整體就有很大提高。
例子:記錄可以整體賦值
/*
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子句中使用記錄成員。
原帖地址:https://blog.csdn.net/qfs_v/article/details/2446941
最後更新:2017-04-03 16:49:19
上一篇:
"0x00a1bdb3" 指令引用的 "0x00000001" 內存。該內存不能為 "read"。
下一篇:
JDBC PreparedStatement 批量查詢 in 的實現 方案
馬雲看上盯盯拍,雲棲大會聯合搞事情
Android模塊化編譯
java中文亂碼解決之道(七)—–JSP頁麵編碼過程
System.Runtime.InteropServices.COMException (0x8004E00F): COM+ 無法與 Microsoft 分布式事務協調程序交談 (異常來自 HRESU
已知三角形的三條中線長度求麵積
VM啟動報錯Cannot open the disk,Failed to lock the file
張孝祥JAVA就業培訓指南229頁錯誤代碼:關於HashTable我的糾正
Python正則表達式精講
淺談NB-IoT技術對農業物聯網發展的影響
Java你不得不看的十本書,進階