近來在自學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_hisbefore 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,檢視表空間的名字及...