<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA歷程
    希望我的這個博客能給那些想在java的海洋中拼搏的人有所幫助。謝謝光臨!
    posts - 8,  comments - 6,  trackbacks - 0
    數據庫有兩張表,是關于某公司員工資料、薪水和部門信息的,它們分別是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,'??èy',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,'êD3?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;

    posted on 2007-05-24 11:18 I LOVE JAVA 閱讀(231) 評論(0)  編輯  收藏 所屬分類: Jdbc、Jdo、Database方面

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲欧美日韩国产成人| 久久久久se色偷偷亚洲精品av| 欧美亚洲国产SUV| 麻豆成人精品国产免费| 亚洲AV第一成肉网| 国产一级一片免费播放i| 美女视频黄频a免费观看| 亚洲av无码乱码在线观看野外| 理论秋霞在线看免费| 亚洲精品国产精品国自产观看| 一级做a爰片久久免费| 亚洲精品无码成人AAA片| 一级毛片在线免费看| 免费夜色污私人影院网站电影| 午夜国产大片免费观看| 尤物视频在线免费观看| 亚洲高清专区日韩精品| 亚洲视频免费播放| 中文字幕在线观看亚洲日韩| 国产无遮挡又黄又爽免费视频| 四虎一区二区成人免费影院网址| 亚洲中文久久精品无码| 日本视频一区在线观看免费| 亚洲精品精华液一区二区| 国产精品亚洲高清一区二区| 久99久精品免费视频热77| 亚洲色最新高清av网站| 在线亚洲精品福利网址导航| 永久免费视频网站在线观看| 亚洲成AV人片高潮喷水| 亚洲日韩精品射精日| 国产一卡2卡3卡4卡2021免费观看 国产一卡2卡3卡4卡无卡免费视频 | 久久青青草原亚洲av无码app| 免费H网站在线观看的| 日韩少妇内射免费播放| 亚洲国产精品人久久| 在线观看人成网站深夜免费| 亚洲一区二区三区日本久久九| 好吊妞在线新免费视频| 中文在线日本免费永久18近| 中文字幕亚洲综合小综合在线|