oracle 中使用 pl/sql代碼塊


1、寫匿名塊,輸入三角形三個表的長度。在控制台打印三角形的面積。

declare
          -- (p=(a+b+c)/2)
          --聲明三角形的面積 三條邊 的
 
          v_a number (10,2):=&no1;
         v_b number (10,2):=&no2;
         v_c number (10,2):=&no3;
        v_p number (10,2);
    begin
          v_p:=1/4*sqrt((v_a+v_b+v_c)*(v_a+v_b-v_c)*(v_a+v_c-v_b)*(v_b+v_c-v_a));
--打印輸出 dbms_output.put_line('三角形面積是:'||v_p); end;

2、輸入部門編號,在控制台打印這個部門的名稱,總人數,平均工資(基本工資+獎金)

declare
--聲明部門編號
    type emp_record_type is record(
             dname dept.dname%type,
             empno emp.empno%type,
             sal emp.sal%type
);
        v_emp emp_record_type;
        v_depton emp.deptno%type;
        v_avg emp.sal%type;
        v_count number(8,2);
    begin
      --查詢這個部門的總人數 計算出 這個部門的平均工資 平均工資是(基本工資+獎金)
 select dname,count(*),avg(sal+nvl(comm,0))into v_emp from emp e inner join dept d on e.deptno=d.deptno where e.deptno=&no group by e.deptno,dname;
      --打印輸出
       dbms_output.put_line('部門名稱:'||v_emp.dname||',平均工資'||v_emp.sal||'總數'||v_emp.empno); end;

3、編寫一個PL/SQL塊,輸出所有員工的員工姓名、員工號、工資和部門號

declare 
--定義記錄類型
    type emp_record_type is record(
       ename emp.ename%type,
        empno emp.empno%type,
        sal emp.sal%type,
     deptno emp.deptno%type     
);
    type emp_table_type is table of emp_record_type index by binary_integer;

--定義表變量
    v_emp emp_table_type;

--定義循環變量

v_num number(8);

begin
  select count(empno) into v_num from emp;

  for i in 1 .. v_num
  loop
    select ename,empno,sal,deptno into v_emp(i) from (select e.*,rownum r from emp e where rownum<=14) where r=i;
  end loop;
  
  
  for i in 1 .. v_num
  loop
    dbms_output.put_line('員工姓名:'||v_emp(i).ename||',員工號:'||v_emp(i).empno||',工資:'||v_emp(i).sal||'部門號:'||v_emp(i).deptno);
  end loop;
end;

 

 4,編寫一個PL/SQL塊,輸出所有比本部門平均工資高的員工信息。

declare
v_sal emp.sal%type;
--在控制台輸入部門編號
v_deptno emp.deptno%type :=&no;
--查詢所有比本部門平均工資高的員工信息
cursor query_info is select e.empno, e.ename,e.sal,e.deptno
from emp e where sal>(
select  avg(sal+nvl(comm,0)) from emp where deptno=v_deptno);

sal emp.sal%TYPE;
empno dbms_sql.Number_Table;
ename dbms_sql.Varchar2_Table;
deptno dbms_sql.Number_Table;
begin
  --遍歷打印
for v_count in query_info loop
dbms_output.put_line('員工編號'||v_count.empno ||'員工姓名 '||v_count.ename ||' 基本工資'||v_count.sal ||'部門編號 '||v_count.deptno);
end loop ;
end;

5、編寫一個PL/SQL塊,輸出所有員工及其部門領導的姓名、員工號及部門號。

declare
v_emp  emp%rowtype;
cursor a is select a.empno,a.ename,a.deptno,m.ename mname from emp a inner join emp m on a.empno=m.mgr;
 
begin
  for v_emp in a
    loop
      dbms_output.put_line('員工編號:'||v_emp.empno||'員工姓名:'||v_emp.ename||'部門編號:'||v_emp.deptno||' 領導姓名 '||v_emp.mname);
      end loop;
  end;

6,查詢姓為“SMITH”的員工信息,並輸出其員工號、姓名、工資、部門號。如果該員工不存在,則插入一條新記錄,員工號為2012,員工姓名為“Smith”,工資為7500元,入職日期為“2002年3月5日”,部門號為50。如果存在多個名“Smith”的員工,則輸出所有名為“Smith”的員工號、姓名、工資、入職日期、部門號L。

declare
v_emp emp%rowtype;

begin
  select * into v_emp from emp where ename='Smith';
  dbms_output.put_line('工號:'||v_emp.empno||',姓名:'||v_emp.ename||',工資:'||v_emp.sal||',部門號:'||v_emp.deptno);  
    
exception
  when no_data_found then
  insert into emp(empno,ename,sal,deptno) values(2016,'Smith',7500,50);
 
  commit;
  when too_many_rows then
      for v_emp in (select * from emp where ename='Smith') loop
      dbms_output.put_line('工號:'||v_emp.empno||',姓名:'||v_emp.ename||',工資:'||v_emp.sal||',部門號:'||v_emp.deptno);
    
  end loop;  

 
end;

7、輸入員工編號,根據員工的入職時間修改發放獎金類,大於等於6年的獎金為2000,小於6年的獎金是1500

 

begin
  select hiredate into v_hiredate from emp where empno=&no1;
  if(sysdate-v_hiredate)>365*6 then
    v_comm:=2000;
    else
    v_comm:=1500;
  end if;
  update emp set comm=v_comm where empno=&no;
  if(sql%rowcount>0)then
  dbms_output.put_line('修改成功');
  else
  dbms_output.put_line('修改失敗');
  end if;
end;

 8.計算一百以內的素數

declare fig boolean; begin
  --循環100以內的數
  for i in 2..100 loop -- 判斷是否是素數,條件滿足
  fig:=true; for j in 2..trunc(i/2) loop if(mod(i,j)=0)then fig:=false; exit; end if; end loop; --最后輸出判斷,如果fig為true。則該自然數是素數,則輸出
  if fig then dbms_output.put_line(i); end if; end loop; end;

9、輸出100以內的自然數

--使用loop循環輸出一百以內的自然數
declare v_i number(8):=1; begin loop dbms_output.put_line(v_i); if v_i>=100 then
      exit; end if; v_i:=v_i+1; end loop; end; --使用while循環輸出一百以內的自然數
declare V_i number(8):=1; begin
  while v_i<=100 loop dbms_output.put_line(v_i); v_i:=v_i+1; end loop; end; declare
--使用for循環輸出一百以內的自然數
begin
 for v_i in 1..100 loop dbms_output.put_line(v_i); end loop; end; declare v_emp emp_table%type; begin
select * bulk collect into v_emp from emp; for v_i in v_emp.first .. v_enmp.last loop dbms_output.put_line('員工編號'||v_emp(v_i),empno); end loop; end;

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM