pl/sql表和記錄一樣,都是用戶自定義的數(shù)據(jù)結(jié)構(gòu)。record類似于c語言中結(jié)構(gòu)(struct)而pl/sql表類似于c語言的數(shù)組或集合,只是這個(gè)數(shù)據(jù)的元素可以是用戶自定義的類型。record可以存儲(chǔ)一條記錄,而pl/sql表可以存儲(chǔ)多條record記錄。
一,什么是記錄(Record)?
由單行多列的標(biāo)量構(gòu)成的復(fù)合結(jié)構(gòu)。可以看做是一種用戶自定義數(shù)據(jù)類型。組成類似于多維數(shù)組。
將一個(gè)或多個(gè)標(biāo)量封裝成一個(gè)對(duì)象進(jìn)行操作。是一種臨時(shí)復(fù)合對(duì)象類型。
記錄可以直接賦值。RECORD1 :=RECORD2;
記錄不可以整體比較.
記錄不可以整體判斷為空。
二,%ROWTYPE和記錄(Record)?
請(qǐng)區(qū)別%ROWTYPE和記錄(Record)類型。%ROWTYPE可以說是Record的升級(jí)簡(jiǎn)化版。
區(qū)別在與前者結(jié)構(gòu)為表結(jié)構(gòu),后者為自定義結(jié)構(gòu)。二者在使用上沒有很大區(qū)別。前者方便,后者靈活。在實(shí)際中根據(jù)情況來具體決定使用。
Record + PL/SQL表可以進(jìn)行數(shù)據(jù)的多行多列存儲(chǔ)。
三,如何創(chuàng)建和使用記錄?
①創(chuàng)建記錄類型
語法:
TYPE 記錄名 IS RECORD
(
filed1 type1 [NOT NULL] [:=eXPr1],
....... ,
filedN typen [NOT NULL] [:=exprn]
)
其中,filed1是標(biāo)量的名字。
②聲明記錄類型變量:
記錄類型變量名 記錄類型
③填充記錄。
④訪問記錄成員
記錄類型變量名.filed1
.........
記錄類型變量名.filedN
注意:
表字段類型修改后,還需要修改記錄字段類型,有時(shí)候可能會(huì)忘記,從而出現(xiàn)錯(cuò)誤。
對(duì)于記錄內(nèi)每個(gè)字段(filed1.。。。),可以指定也可以使用%TYPE和%ROWTYPE動(dòng)態(tài)指定記錄字段類型。
好處是表字段發(fā)生變化,記錄字段自動(dòng)改變。但是,由于每次執(zhí)行前,遇到%TYPR或%ROWTYPE,
數(shù)據(jù)庫系統(tǒng)都會(huì)去查看對(duì)應(yīng)表字段類型,會(huì)造成一定的數(shù)據(jù)庫開銷,如果系統(tǒng)中大量使用記錄類型,則對(duì)性能會(huì)有一定影響。
另外如果刪除了某一字段,而自定義記錄中使用了該字段,也會(huì)有可能忘記刪除該字段。
對(duì)數(shù)據(jù)庫負(fù)荷偏低的系統(tǒng),性能問題一般可以不重點(diǎn)關(guān)注,但是對(duì)于高負(fù)荷數(shù)據(jù)庫服務(wù)器,
各個(gè)環(huán)節(jié)都要考慮性能問題,每處節(jié)省一點(diǎn)出來,性能整體就有很大提高。
語法:
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動(dòng)態(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ù)關(guān)系。
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ù)表結(jié)構(gòu)合理安排記錄字段。比如主外鍵。
如果用記錄(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);
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ù)?
刪除記錄時(shí),只能在delete語句的where子句中使用記錄成員。
posted on 2012-09-05 21:52
kxbin 閱讀(348)
評(píng)論(0) 編輯 收藏 所屬分類:
ORACLE 、
轉(zhuǎn)發(fā)