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...