Oracle PL SQL入門之案例實踐

2021-03-31 08:56:29 字數 4436 閱讀 1441

一. 案例介紹

某資料庫有兩張表,是關於某公司員工資料、薪水和部門資訊的,它們分別是emp表和dept表,兩張表的結

構如下:

要求如下:

1、按照上表結構建立相應的表,並每張表寫入5組合法資料。

2、操縱相關表,使得「技術部」的員工的薪水**20%。

3、建立日誌,追蹤薪水變動情況。

4、建立測試包。

二. 案例的分析與實現

從前面案例的介紹不難看出,要求1考察點為基本sql語句;要求2主要考察復合查詢;要求3是考察觸發器

的應用;要求4的考察面相對多一些,不僅考察了包的建立,而且也考察了在pl/sql中的測試方法。了解了這些

考察的知識點,就可以一一去解決。

要求1:

首先根據前面表的結構可以建立兩張表:

——建立員工表

create table emp (emp_id number(5), emp_name varchar2(20), emp_salary number(4));

——部門表

create table dept (dept_id number(3), dept_name varchar2(20), emp_id number(5));

建立了表之後就可以往表裡面寫資料了,這裡把新增表記錄的**寫入到相應的儲存過程。

/*給emp表新增記錄的儲存過程*/

create or replace procedure ins_table_emp(p_emp_id number,p_emp_name varchar2,p_emp_salary

number) as

v_emp_id number:=p_emp_id;

v_emp_name varchar2(20):=p_emp_name;

v_emp_salary number:=p_emp_salary;

begin

insert into emp values (v_emp_id,v_emp_name,v_emp_salary);

end ins_table_emp;

/*給dept表新增記錄的儲存過程*/

create or replace procedure ins_table_dept(p_dept_id number,p_dept_name varchar2,p_emp_id number)

asv_dept_id number:=p_dept_id;

v_dept_name varchar2(20):=p_dept_name;

v_emp_id number:=p_emp_id;

begin

insert into dept values (v_dept_id,v_dept_name,v_emp_id);

end ins_table_emp;

/*呼叫相應的儲存過程實現記錄新增*/

execute ins_table_emp(10000,'a',4000);

execute ins_table_emp(10001,'b',2300);

execute ins_table_emp(10002,'c',3500);

execute ins_table_emp(10003,'d',3500);

execute ins_table_emp(10004,'e',3500);

execute ins_table_dept(111,'張三',10000);

execute ins_table_dept(111,'張三',10001);

execute ins_table_dept(111,'張三',10002);

execute ins_table_dept(112,'趙六',10003);

execute ins_table_dept(113,'宋七',10004);

要求2:

給指定部門的員工加薪,這實際上是乙個復合查詢,首先需要把所有該部門的員工塞選出來,然後對這些

員工的薪水進行相應的改動。依照這一思路,**如下:

(需要注意的是:將要加薪的部門作為引數,這樣的儲存過程更有靈活性。)

create or replace procedure add_salary(p_dept_name varchar2) as

v_dept_name varchar2(20):=p_dept_name;

begin

update emp set emp.emp_salary=emp.emp_salary*1.2 where emp.emp_id in (select emp.emp_id from

emp,dept where emp.emp_id=dept.emp_id and dept.dept_name=v_dept_nam);

end add_salary;

要求3:

create table salary(old_s number(4), new_s number(4), differ_s number(4));

建立日誌對薪水的變動情況形成乙個追蹤,也就是說,如果對某個職員的薪水進行變更就應該將其相應的

變更記錄全部記下來。如果對emp表的salary欄位建立乙個觸發器,來監視對salary的更改,把每次更改進行記

錄,這樣就達到了要求3的目的了。

create or replace trigger print_salary_change  

before delete or insert or update on emp  --觸發事件

for each row                  -- 每修改一行都需要呼叫此過程

declare--只有觸發器的宣告需要declare,過程和函式都不需要

salary_balance number;

begin

--:new 與:old分別代表該行在修改前和修改後的記錄

salary_balance:=:new.emp_salary-:old.emp_salary;

insert into salary values(:old.emp_salary,:new.emp_salary,salary_balance);

end print_salary_change;

execute add_salary('張三');就可以看到salary表的變化。

要求4:

與其他語言(c/c++等)相比,pl/sql的測試有其不同之處,歸納下來有三種方法:

1、使用dbms_output包的put_line方法來顯示中間變數,以此來觀察程式是否存在邏輯錯誤。

2、插入測試表的方法。即建立乙個臨時的中間表,然後把所有涉及到的中間變數的結果都作為記錄插入到

中間表中,這樣可以查詢表中的結果來觀察程式的執**況。

3、使用異常處理手段,對可疑的程式段使用begin … end ,然後可以在exception裡進行異常捕獲處理。

這裡準備使用第二種方法來建立乙個測試包,pl/sql裡包的概念類似於物件導向裡的類的概念,包將一組

操作和屬性封裝在一起,不僅增強了程式的模組化,而且由於封裝了更多的操作和屬性而提高了執行效能。建

立乙個pl/sql需要兩個步驟:首先要建立包頭,類似於建立乙個類的標頭檔案,裡面主要對包中的過程,函式和

變數的宣告;第二部分主要是包體部分,實現前面宣告的過程和函式,另外還需要對包進行初始化等工作。

根據這一思路,建立測試包如下:

create table debugtable (d_numberofline number,d_description varchar2(20),d_valueofvariable

varchar2(20));

/*包頭部分*/

create or replace package debug as

procedure debug(v_description varchar2,v_valueofvariable varchar2)

procedure reset;

v_numberofline number;

end debug;

/*包體部分*/

create or replace package body debug as

procedure debug(v_description varchar2,v_valueofvariable varchar2) is

begin

insert into debugtable

values(v_numberofline,v_description,v_valueofvariable);

v_numberofline:=v_numberofline+1;

end debug;

procedure reset is

begin

v_numberofline:=1;

delete from debugtable;

end reset;

/*初始化部分*/

begin

reset;

end debug;

Oracle PL SQL入門之案例實踐

前面已經了解了關於 pl sql程式設計的基礎,本文將結合乙個案例來加深對這些知識點的理解。一 案例介紹 某資料庫有兩張表,是關於某公司員工資料 薪水和部門資訊的,它們分別是emp表和dept表,兩張表的結構如下 要求如下 1 按照上表結構建立相應的表,並每張表寫入5組合法資料。2 操縱相關表,使得...

Oracle(PLSQL)入門學習六

事務 把一組操作看做乙個工作單元,要麼都執行,要麼都不執行。dml操作才有事務,查詢沒有事務。提交事務 commit 回滾事務 rollback create table bank id number 5 primary key,money number 10 check money 0 inser...

Oracle(PLSQL)入門學習四

oracle表連線 內連線 外連線。外連線分左連線 右連線。多表查詢時,如果表之間沒有條件關聯,則會把所有匹配的結果查詢出來,例如a表6條資料,b表7條資料,查出來就是42條。笛卡爾積 返回兩張表中所有匹配的結果,沒有意義。所以多表查詢,必須寫關聯條件。select from staff,depar...