1. 程式人生 > >oracle--PLSQL的應用例項

oracle--PLSQL的應用例項

PLSQL的應用例項

一、統計每年入職的員工人數

分析:

SQL語句:
select to_char(hiredate,'yyyy') from emp;
---> 集合 ---> 游標 ---> 迴圈  ---> 退出條件:notfound

變數:1. 初始值  2. 最終得到
每年入職的員工人數:
count80 number := 0;
count81 number := 0;
count82 number := 0;
count87 number := 0;

解:

set serveroutput on

declare
  cursor cemp is select to_char(hiredate,'yyyy') from emp;
  phiredate varchar2(4);

  --每年入職的員工人數:
  count80 number := 0;
  count81 number := 0;
  count82 number := 0;
  count87 number := 0;
begin
  open cemp;
  loop
    --取一個員工的入職年份
    fetch cemp into phiredate;
    --退出條件:notfound
    exit when cemp%notfound;

    --判斷年份
    if phiredate = '1980' then count80:=count80+1;
      elsif phiredate = '1981' then count81:=count81+1;
      elsif phiredate = '1982' then count82:=count82+1;
      else count87:=count87+1;
    end if;
  end loop;
  close cemp;

  dbms_output.put_line('Total:'||(count80+count81+count82+count87));
  dbms_output.put_line('1980:'||count80);
  dbms_output.put_line('1981:'||count81);
  dbms_output.put_line('1982:'||count82);
  dbms_output.put_line('1987:'||count87);
end;

二、使用scott使用者下的emp表:

為員工漲工資。從最低工資調起每人漲10%,但工資總額不能超過5萬元,請計算漲工資的人數和漲工資後的工資總額,並輸出漲工資人數及工資總額。

分析:

SQL語句:
select empno,sal from emp order by sal;
---> 游標 ---> 退出:1. 總額 > 5w   2. notfound

變數:1. 初始值  2. 最終得到
漲工資的人數: countEmp number := 0;
漲後的工資總額: salTotal number;
1. select sum(sal) into salTotal from emp;
2. 漲後=漲前 + sal * 0.1

解:

set serveroutput on
declare
  cursor cemp is select empno,sal from emp order by sal;
  pempno emp.empno%type;
  psal   emp.sal%type;
  --漲工資的人數: 
  countEmp number := 0;
  --漲後的工資總額: 
  salTotal number;
begin
  --得到初始的工資總額
  select sum(sal) into salTotal from emp;

  open cemp;
  loop
    --1. 總額 > 5w
    exit when salTotal > 50000;
    --取一個員工
    fetch cemp into pempno,psal;
    --2. notfound
    exit when cemp%notfound;

    --漲工資
    update emp set sal=sal*1.1 where empno=pempno;
    --人數+1
    countEmp := countEmp + 1;
    --2. 漲後=漲前 + sal * 0.1
    salTotal := salTotal + psal * 0.1;

  end loop;
  close cemp;

  commit;
  dbms_output.put_line('人數:'||countEmp||'   總額:'||salTotal);

end;

三、

用PL/SQL語言編寫一程式,實現按部門分段(6000以上、(6000,3000)、3000以下)統計各工資段的職工人數、以及各部門的工資總額(工資總額中不包括獎金)

建立一張表來儲存資料:

create table msg
(deptno number,
 count1 number,
 count2 number,
 count3 number,
 saltotal number);

分析:

SQL語句:
部門: select deptno from dept;
部門中員工的薪水:select sal from emp where deptno=???


變數:1. 初始值  2. 最終得到
每個段的人數:
count1 number; count2 number; count3 number;
部門的工資總額: salTotal number := 0;
1.select sum(sal) into salTotal from emp where deptno=???
2.累加

解:

set serveroutput on
declare
  --部門
  cursor cdept is select deptno from dept;
  pdeptno dept.deptno%type;

  --部門中員工的薪水
  cursor cemp(dno number) is select sal from emp where deptno=dno;
  psal emp.sal%type;
  --每個段的人數:
  count1 number; count2 number; count3 number;
  --部門的工資總額: 
  salTotal number := 0;
begin
  open cdept;
  loop
    --取一個部門
    fetch cdept into pdeptno;
    exit when cdept%notfound;

    --初始化
    count1:=0;count2:=0;count3:=0;
    --部門的工資總額
    select sum(sal) into salTotal from emp where deptno=pdeptno;

    --取部門中員工的薪水
    open cemp(pdeptno);
    loop
      --取一個員工
      fetch cemp into psal;
      exit when cemp%notfound;

      --判斷
      if psal < 3000 then count1:=count1+1;
        elsif psal>=3000 and psal<6000 then count2:=count2+1;
        else count3:=count3+1;
      end if;
    end loop;
    close cemp;

    --儲存結果
    insert into msg values(pdeptno,count1,count2,count3,nvl(saltotal,0));

  end loop;
  close cdept;

  commit;
  dbms_output.put_line('完成');
end;

四、

用PLSQL語言編寫一個程式。按系(系名)分段統計(成績小於60分,60-85分, 85分以上)“大學物理”課程各分數段的學生人數,及各系學生的平均成績。
提示:可建立一張新表,存放統計資訊。

參考執行結果:

結果.png

分析:

--建立存放資料的結構表:
create table msg
(cname char(20),
 dname char(30),
 seg_1 number,
 seg_2 number,
 seg_3 number,
 avggrade number(4,2)
 );

--利用游標迴圈處理資料,並把處理結果寫到結果表中:

答案:

方式一:

declare 
  cursor c1 is select distinct dno,dname from dep order by dno;
  cursor c2(c_name char) is select student.dno,grade,course.cname from student,dep,sc,course 
                            where student.dno=dep.dno and student.sno=sc.sno and course.cno=sc.cno and cname=c_name  order by dno;
  tempcname char(20);
  stu_num1 number;
  stu_num2 number;
  stu_num3 number;
  stu_dno dep.dno%type;
  stu_grade sc.grade%type;
  avggrade number;
  people number;
begin
  open c2('大學物理');
  fetch c2 into stu_dno,stu_grade,tempcname;
  for r1 in c1
  loop
     people:=0;
     stu_num1:=0;
     stu_num2:=0;
     stu_num3:=0;
     avggrade:=0;
     while r1.dno=stu_dno
     loop
        people:=people+1;
        avggrade:=(avggrade*(people-1)+stu_grade)/people;
        if stu_grade<60 then stu_num1:=stu_num1+1;
        elsif stu_grade<85 and stu_grade>=60 then stu_num2:=stu_num2+1;
        else stu_num3:=stu_num3+1;
        end if;

        fetch c2 into stu_dno,stu_grade,tempcname;
        exit when c2%notfound;
     end loop;

     insert into msg values(tempcname,r1.dname,stu_num1,stu_num2,stu_num3,avggrade); 
  end loop;
commit;
end; 

方式二:

declare
   cursor cdep is select distinct dno,dname from dep order by dno;
   cursor cstudent(c_name char,d_no char) is select grade from sc 
                                             where sno in (select distinct sno from student where dno=d_no) 
                                             and cno in (select distinct cno from course where cname=c_name);
   pcName char(8);
   pdno dep.dno%type;
   pdname dep.dname%type;

   stu_num1 number;
   stu_num2 number;
   stu_num3 number;
   stu_grade sc.grade%type;
   sumGrade number;
   people   number;
begin
   pcName := '大學物理';
   open cdep;
   loop
     fetch cdep into pdno,pdname;
     exit when cdep%notfound;
     people:=0;
     stu_num1:=0;
     stu_num2:=0;
     stu_num3:=0;
     sumGrade:=0;
     open cstudent(pcName,pdno);
     loop 
         fetch cstudent into stu_grade;
         exit when cstudent%notfound;
         if stu_grade<60 then stu_num1:=stu_num1+1;
           elsif stu_grade<85 and stu_grade>=60 then stu_num2:=stu_num2+1;
           else stu_num3:=stu_num3+1;
         end if;     
         sumGrade := sumGrade+stu_grade;
         people := people + 1;
     end loop;
     close cstudent;

     if people>0 then
        insert into msg values(pcName,pdname,stu_num1,stu_num2,stu_num3,sumGrade/people);    
     end if;

 end loop;
 close cdep;
commit;
end;

相關推薦

oracle--PLSQL應用例項

PLSQL的應用例項 一、統計每年入職的員工人數 分析: SQL語句: select to_char(hiredate,'yyyy') from emp; ---> 集合 ---> 游標 ---> 迴圈 ---> 退出條件:n

Oracle列轉行函式 Listagg() 語法詳解及應用例項

工作中用到一段比較複雜的SQL查詢指令碼,使用了listagg()函式實現了具有多個值的欄位的填充(即,列表聚合,list aggregation(我猜的))。說簡單點,listagg()函式可以實現多列記錄聚合為一條記錄,從而實現資料的壓縮、緻密化(data densifi

Oracle INSTR函式(子字串查詢)語法詳解及應用例項

 據說以下這道看似簡單的問題可以測試Oracle查詢的能力: 問題: 答案: select c.ci_id,wm_concat(s.stu_name) from pm_ci c,pm_stu s where instr(c.stu_ids,s.stu_

oracle PLSQL程序造數據筆記

blog rst plsql cnblogs varchar2 spa subst type evel 1.造假數據: 1 declare 2 type t_website_id is table of number(10); 3 type t_websit

Oracle PLSQL:

source line alter 其他 emp if語句 close divide rom PLSQL:   符號:     賦值: :=   基本示例: set serveroutput on //設置輸出打開. declare

Oracle PLSQL 實例精解 中文版pdf

span color ref tle back 工程化 round sql 掌握 下載地址:網盤下載 《Oracle PLSQL 實例精解》是一本逐步分解的,詳盡的pl/sql編程教程,使用真實場景的試驗、範例和練習來介紹讀者所需的pl/sql編程技能,涵蓋oracle 1

Oracle 12c應用連接VIP輪訓負載均衡?

vip 應用連接 目前很多生產數據庫都是兩節點RAC,應用連接的數據庫通常會連接SCAN IP或者VIP,這裏做一個小實驗,如果我們使用VIP連接,應該怎樣配置我們的客戶端,負載均衡是否是嚴格意義上的輪訓機制,只有通過自己的測試才能得到準備的答案。tnsnames.ora配置<rac01:orc

oracle PLSQL 多結果集嵌套循環處理優化

from then PE The 多結果集 多結果 som HERE oracl oracle多結果集嵌套循環處理優化 --性能差 begin for a in (select id,name,sex,idcard from people) loop fo

學海無涯——人工智慧應用例項之寫作軟體的基本概念

公司技術培訓中提到了Auto Narrative Writing,即自動寫作。 目前,本人也僅是使用VBA生成SQL statement(Insert語句),原理是字串拼接。 而這個自動寫作,顯然是更改級別的“字串拼接”了。先學習基礎吧。 ----------------------

Oracle儲存過程例項分析總結(程式碼)

1.儲存過程結構 1.1 第一個儲存過程 ? 1 2 3 4

簡單的 FastDFS + Nginx 應用例項

本文來自作者 only you 在 GitChat 上分享 「FastDFS + Nginx(單點部署)應用例項」 編輯 | 哈比 現在流行框架設計簡述 在網際網路大行其道的今天。各種分散式系統已經司空見慣。

Vuex的應用例項 --天氣查詢應用

weather 其實是一個很小很簡單的demo了,主要就是再熟悉一下ajax和vuex。其中用了和風天氣的api,可以精確到行政區劃內的天氣。因為這裡涉及到了在一個頁面內同時請求多個頁面,以及在涉及到城市和區域之間的各種切換和設定預設值,所以在vuex這一部分還是研究了一下才行。 實

Oracle 10g 應用補丁PSU 10.2.0.5.180717

  最近測試了一下在Oracle 10g下面(單例項下面)升級、應用補丁PSU 10.2.0.5.180717,打這個補丁的主要原因是 Oracle 將於 2019年6月啟用新的SCN相容性,並且由於BigSCN的作用,96K每秒的SCN增速,都可能會使得通過DB Link的訪問產生SCN過度拉昇

60個BCB(C++Build)初學者 應用例項

1.怎樣在C++Builder中建立使用DLL 2.用C++Bulider在WIN.INI中儲存資訊 3.如何在C++Builder中檢測硬體 4.C++Builder如何響應訊息及自定義訊息 5.利用C++ Builder開發動畫DLL 6.用C++ Builder 3製作螢幕保護程式 7.TCP

oracle完全刪除例項

問題描述:   重建oracle庫例項,因此要刪除資料庫例項 問題解決:   利用自用自帶的dbca庫管理,實現圖形化刪除例項  01、登入安裝oracle資料庫的linux 開啟xshell企業版的Xmanager,觀察啟用視窗預設0.0 [[email protect

Oracle 備份恢復例項

Oracle 備份恢復例項:三思筆記 1 shutdown abort 系統歸檔模式,有備份 create table xx as select * from emp;   update xx set ena

矩陣應用例項及js實現矩陣轉置演算法

場景: 後端返回的是[[‘2015-1-1’,1,1],[‘2015-1-2’,1,2]]這樣的Json陣列,代表的意思是2015-1-1這個日期下新增的資料為1,減少的資料為1,2015-1-2這個日期,新增的資料為1,減少的資料為2,但是在統計圖表上要在x軸顯示時間,y軸顯示新增和減少的資料這時,就要把

python requests,bs4應用例項

獲取豆瓣最新電影的ID號和電影名稱 import requests from bs4 import BeautifulSoup url = "https://movie.douban.com/cinema/nowplaying/xian/" # 1). 獲取頁面資訊 response

centos部署oracle rac單例項11.2.0.3資料庫(使用asm磁碟)

部署oracle rac單例項資料庫,需要安裝grid和datavase兩部分,所以首先建立兩個使用者oracle和grid,因為不能使用root使用者進行安裝,在安裝之前首先需要修改一些系統引數和安裝一些庫。 1.建立使用者和使用者組   首先是官方推薦的使用者和使用者組清單:

oracle 儲存過程 例項 迴圈 給查詢賦值 遊標取值

CREATE OR REPLACE PROCEDURE p_updete_gs is     --僅供參考   i_jdid varchar(32);   i_ryid varchar(32);   cursor cur is --