Oracle PL SQL入門之案例實踐

2021-04-17 06:59:24 字數 4414 閱讀 3044

前面已經了解了關於

pl/sql程式設計的基礎,本文將結合乙個案例來加深對這些知識點的理解。

一. 案例介紹

某資料庫有兩張表,是關於某公司員工資料、薪水和部門資訊的,它們分別是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) as

v_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;

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

begin

ins_table_emp(10000,'',4000);

ins_table_emp(10001,'??㨹',2300);

ins_table_emp(10002,'3?t',3500);

ins_table_emp(10003,'㠿??',3500);

ins_table_emp(10004,'㡿瀇',3500);

ins_table_dept(111,'dd?t2?',10000);

ins_table_dept(111,'dd?t2?',10001);

ins_table_dept(111,'dd?t2?',10002);

ins_table_dept(112,'??㪿2?',10003);

ins_table_dept(113,'㪄3?2?',10004);

end;

要求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_id='??㪿2?');

end add_salary;

要求3:

建立日誌對薪水的變動情況形成乙個追蹤,也就是說,如果對某個職員的薪水進行變更就應該將其相應的變更記錄全部記下來。如果對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.salary=:old.salary;

dbms_output.put_line('old salary is: '|| :old.salary);

dbms_output.put_line('old salary is: '|| :new.salary);

dbms_output.put_line('old salary is: '|| to_char(salary_balance));

end print_salary_change;

要求4:

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

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

2、插入測試表的方法。即建立乙個臨時的中間表,然後把所有涉及到的中間變數的結果都作為記錄插入到中間表中,這樣可以查詢表中的結果來觀察程式的執**況。

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

這裡準備使用第二種方法來建立乙個測試包,pl/sql裡包的概念類似於物件導向裡的類的概念,包將一組操作和屬性封裝在一起,不僅增強了程式的模組化,而且由於封裝了更多的操作和屬性而提高了執行效能。建立乙個pl/sql需要兩個步驟:首先要建立包頭,類似於建立乙個類的標頭檔案,裡面主要對包中的過程,函式和變數的宣告;第二部分主要是包體部分,實現前面宣告的過程和函式,另外還需要對包進行初始化等工作。

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

/*包頭部分*/

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;

三.小結

綜合前面對4個問題的解答,基本把pl/sql的主要部分融會進來了,雖然很多地方只是涉及到比較粗淺的層次,但是有了這一基礎,深入下去也是不難的。

總之,pl/sql程式設計與其他語言程式設計有一定的區別,讀者只有把握好其特點才能更好的掌握資料庫開發的方面知識。

Oracle PL SQL入門之案例實踐

一 案例介紹 某資料庫有兩張表,是關於某公司員工資料 薪水和部門資訊的,它們分別是emp表和dept表,兩張表的結 構如下 要求如下 1 按照上表結構建立相應的表,並每張表寫入5組合法資料。2 操縱相關表,使得 技術部 的員工的薪水 20 3 建立日誌,追蹤薪水變動情況。4 建立測試包。二 案例的分...

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