Oracle中的記錄 Record

2021-08-10 06:25:34 字數 4642 閱讀 7753

oracle中可以通過定義記錄來實現一些特定的程式設計要求,通過記錄的形式也可以簡化解決問題的方法。

由單行多列的標量構成的復合結構。可以看做是一種使用者自定義資料型別。組成類似於多維陣列。將乙個或多個標量封裝成乙個物件進行操作。是一種臨時復合物件型別。

記錄可以直接賦值。record1 :=record2;

記錄不可以整體比較。

記錄不可以整體判斷為空。

請區別%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');

endif; 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');

endif;

end;

/*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);

endif;

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刪掉表中重複的記錄

oracle資料庫中由於沒有設定任何約束,裡面含有很多的重複項。現在的問題是如何刪掉這些重複項,重複的記錄只保留其中的一條。如下建表語句 create table message student3 stu id integer not null,表中沒有唯一性約束 stu number varcha...

ORACLE中SQL產生記錄的例子

如果要插入固定有序的資料,用乙個sql可以用下面的方法 select rownum 1 from dual connect byrownum 21但只支援9i或者更高版本,如果是8i就要建立個臨時表了 alter table cmes.c parameter num t drop primary k...

Oracle中 連線寫法記錄解惑

最近遇到乙個sql如下 select i.client id,3 status,1 exchange type from dev.openstock active op,dev.prestock account p,dev.preclient info i where op.active resul...