国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

數據庫案例分析

2024-07-21 02:06:37
字體:
來源:轉載
供稿:網友
  • 本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。

  • 檔案管理系統——學籍翻譯系統
    一.案例介紹
      (部分舉例)學籍管理數據庫有兩張表,是關于某高校學生信息和成績信息的,它們分別是emp表和

    dept表,兩張表的結構如下:
        (1)學生基本信息表student
        (2)成績表grade
      要求如下:
      1、按照上表結構建立相應的表,并每張表寫入5組合法數據。
      2、操縱相關表,使得“成績優秀(90分以上)的”的學生的獎學金補助上漲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;

    上一篇:數據庫事務

    下一篇:SQL*PLUS 初學

    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 拜泉县| 海南省| 牙克石市| 门源| 金门县| 友谊县| 南乐县| 布尔津县| 连州市| 西贡区| 化德县| 焉耆| 信宜市| 岢岚县| 柯坪县| 平远县| 潮州市| 乌拉特中旗| 华蓥市| 郸城县| 五家渠市| 万载县| 普安县| 永修县| 青川县| 精河县| 墨玉县| 临泽县| 鄂温| 紫云| 呼图壁县| 昌江| 柞水县| 鞍山市| 贡觉县| 静安区| 梧州市| 湖北省| 泸溪县| 临桂县| 慈利县|