oracle初探秘之維護表

2021-08-25 09:43:25 字數 2995 閱讀 1267

近來在自學plsql,接觸時間尚淺,寫了乙個維護scott名下dept表的觸發器和儲存過程.就當練習了.歡迎大牛們指出缺點.

這是維護表的表結構

create table dept_history(

id number primary key,

deptno number(4),

dname varchar2(14),

loc varchar2(13));

刪除時的觸發器:

create or replace trigger add_dept_his  

before delete on dept

for each row

declare

begin

insert into dept_history values (dept_his_seq.nextval,:old.deptno,:old.dname,:old.loc);

end;

create or replace procedure back_all_dept as  

cursor his_cursor is select * from dept_history;

type his_list is table of dept_history%rowtype;

hisl his_list;

begin

open his_cursor;

fetch his_cursor bulk collect into hisl;

close his_cursor;

for i in hisl.first..hisl.last loop

insert into dept values(hisl(i).deptno,hisl(i).dname,hisl(i).loc);

dbms_output.put_line(hisl(i).deptno||' 編號的資料已經恢復');

delete from dept_history where id=hisl(i).id;

end loop;

end;

/*此方法用於維護dept表中的資料恢復,可以根據dept_history的id來恢復,

也可以根據dname,deptno,loc 來恢復 格式如下:

exec back_dept_bydata(null,null,null,'phoenix');

其他情況類似於.如果有多種查詢條件,則只按照先後順序進行查詢,不滿足條件則退出.

*/

create or replace procedure back_dept_bydata(

his_id in dept_history.id%type,

his_name in dept_history.dname%type,

his_no in dept_history.deptno%type,

his_loc in dept_history.loc%type

) is

type his_list is table of dept_history%rowtype;

hisl his_list;

procedure re_back_all(hisll in his_list) is

back_state boolean :=false;

begin

if hisll.count<>0 then

back_state:=true;--結果集中是否有資料,如果有,則表示有更新.

for i in hisll.first..hisll.last loop

dbms_output.put_line(hisll(i).dname||' 已經恢復完畢');

insert into dept values(hisll(i).deptno,hisll(i).dname,hisll(i).loc);

delete from dept_history where dept_history.id=hisll(i).id;

end loop;

end if;

if not back_state then dbms_output.put_line(' 無資料匹配'); end if;--如果沒有找到資料則列印

end;

begin

--判斷引數id是否為空值.

if his_id is not null then

select * bulk collect into hisl from dept_history where dept_history.id=his_id;

re_back_all(hisl);

--判斷his_name是否為空

elsif his_name is not null then

select * bulk collect into hisl from dept_history where dept_history.dname=his_name;

re_back_all(hisl);

--判斷his_no是否為空

elsif his_no is not null then

select * bulk collect into hisl from dept_history where dept_history.deptno=his_no;

re_back_all(hisl);

--判斷his_loc是否為空

elsif his_loc is not null then

select * bulk collect into hisl from dept_history where dept_history.loc=his_loc;

re_back_all(hisl);

end if;

end;

ORACLE表空間及其維護

基本概念 oracle資料庫被劃分成稱作為表空間的邏輯區域 形成oracle資料庫的邏輯結構。乙個oracle資料庫能夠有乙個或多個表空間,而乙個表空間則對應著乙個或多個物理的資料庫檔案。表空間是oracle資料庫恢復的最小單位,容納著許多資料庫實體,如表 檢視 索引 聚簇 回退段和臨時段等。每個o...

oracle建立和維護表

1 oracle中資料庫物件命名原則 必須由字母開始,長度在1 30個字元之間 名字中只能包含a z,a z,0 0,和 同乙個oracle伺服器使用者所擁有的物件名字不能重複。名字不能為oracle的保留字 名字是大小寫不敏感的 2 建立表的語法 create table schema.table...

oracle表空間管理與維護

系統中必須的表空間 system sysaux temp undo 表空間的分類 永久表空間 存放永久性資料,如表,索引等。臨時表空間 不能存放永久性物件,用於儲存資料庫排序,分組時產生的臨時資料。undo表空間 儲存資料修改前的鏡象。select tablespace name,檢視表空間的名字及...