pl/sql練習案例
阿新 • • 發佈:2019-05-09
declare 控制臺輸出 put tput lai -c job avg select
declare
--聲明變量
v_w number(8,2):=&三角形的底邊;
v_h number(8,2):=&三角形的高;
v_s number(8,2);
begin
--計算面積
v_s:=(v_w*v_h)/2;
--控制臺輸出
dbms_output.put_line(‘三角形的面積:‘||v_s);
end;
2,輸入部門編號,在控制臺打印這個部門的名稱,總人數,平均工資(基本工資+獎金)
declare
--聲明變量
v_empno number(8,2):=&員工編號;
v_count number(8,2);
v_avg number(8,2);
begin
case v_empno
when 10 then
dbms_output.put_line(‘部門名稱為:技術部‘);
when 20 then
dbms_output.put_line(‘部門名稱為:銷售部‘);
when 30 then
dbms_output.put_line(‘部門名稱為:公關部‘);
when 40 then
dbms_output.put_line(‘部門名稱為:開發部‘);
else
dbms_output.put_line(‘輸入錯誤‘);
end case;
?
select count(*) into v_count from emp e where deptno=v_empno;
dbms_output.put_line(‘總人數為:‘||v_count);
select avg(sal+nvl(comm,0)) into v_avg from emp
where deptno=v_empno;
dbms_output.put_line(‘平均工資為:‘||v_avg);
?
end;
3,編寫一個PL/SQL塊,輸出所有員工的員工姓名、員工號、工資和部門號
這裏用loop循環
declare
type emp_table_type is table of emp%rowtype
index by binary_integer;
v_emp emp_table_type;
v_i number(8):=1;
begin
--這裏用到了bulk collect into (批量效率的讀取遊標數據)
select * bulk collect into v_emp from emp ;
loop
if v_i>v_emp.count then
exit;
end if;
dbms_output.put_line(
‘員工編號:‘||v_emp(v_i).empno
||‘員工姓名:‘||v_emp(v_i).ename
||‘工資:‘||v_emp(v_i).sal
||‘部門編號:‘||v_emp(v_i).deptno
);
v_i:=v_i+1;
end loop;
?
end;
4,編寫一個PL/SQL塊,輸出所有比本部門平均工資高的員工信息。
這裏用for 循環
declare
type emp_table_type is table of emp%rowtype
index by binary_integer;
v_emp emp_table_type;
begin
select * bulk collect into v_emp from emp where sal>(
select avg(sal) from emp where deptno=&no)and
deptno=&no;
for v_i in 1..v_emp.count
loop
dbms_output.put_line(‘員工編號‘||v_emp(v_i).empno||
‘員工姓名‘||v_emp(v_i).ename ||
‘上級領導‘||v_emp(v_i).job ||
‘領導編號‘||v_emp(v_i).mgr ||
‘入職日期‘|| v_emp(v_i).hiredate ||
‘工資‘||v_emp(v_i).sal ||
‘獎金‘|| v_emp(v_i).comm ||
‘職位編號‘||v_emp(v_i).deptno);
end loop;
?
end;
5,編寫一個PL/SQL塊,輸出所有員工及其部門領導的姓名、員工號及部門號。
這裏用while循環
declare
type emp_table_type is table of emp%rowtype
index by binary_integer;
v_emp emp_table_type;
v_i number(8):=1;
begin
select * bulk collect into v_emp from emp;
while v_i<v_emp.count
loop
dbms_output.put_line(
‘員工編號‘||v_emp(v_i).empno||
‘員工姓名‘||v_emp(v_i).ename||
‘領導姓名‘||v_emp(v_i).job||
‘部門編號‘||v_emp(v_i).deptno);
v_i:=v_i+1;
end loop;
end;
7,輸入員工編號,根據員工的入職時間修改發放獎金類,大於等於6年的獎金為2000,小於6年的獎金是1500
declare
v_comm emp.comm%type;
v_yyyy number(8);
v_empno emp.empno%type:=&員工編號;
begin
--三個查詢,先查詢出當前日期和員工入職日期,然後計算出兩者的相差
--months_between 計算兩個時間段相差的月份
select months_between(
(select sysdate from dual),
(select hiredate from emp where empno=v_empno))
into v_yyyy from dual;
--查詢出工資員工
select comm into v_comm from emp where empno=v_empno;
--將計算後的時間換算為年
v_yyyy:=v_yyyy/12;
--判斷
if v_yyyy>=6 then
if v_comm is null then
update emp set comm=(2000) where empno=v_empno;
else
update emp set comm=(v_comm+2000) where empno=v_empno;
end if;
dbms_output.put_line(‘發放獎金2000元‘);
elsif v_yyyy<6 then
if v_comm is null then
update emp set comm=(1500) where empno=v_empno;
else
update emp set comm=(v_comm+1500) where empno=v_empno;
end if;
dbms_output.put_line(‘發放獎金1500元‘);
else
dbms_output.put_line(‘輸入錯誤‘);
end if;
end;
8,分別用loop ,while,for循環在控制臺輸出1到100的自然數。
loop循環
declare
v_i number(8):=1;
v_m varchar2(1000):=‘‘;
begin
loop
if v_i>100 then
exit;
end if;
v_m:=v_m||v_i||‘ ‘;
v_i:=v_i+1;
end loop;
dbms_output.put_line(v_m);
?
end;
while 循環
declare
v_i number(8):=1;
v_m varchar2(1000):=‘‘;
begin
while v_i<=100
loop
v_m:=v_m||v_i||‘ ‘;
v_i:=v_i+1;
end loop;
dbms_output.put_line(v_m);
?
end;
for 循環
declare v_m varchar2(1000):=‘‘; begin for v_i in 1..100 loop v_m:=v_m||v_i||‘ ‘; end loop; dbms_output.put_line(v_m); end;
9,在控制臺輸出1到100以內的素數。
declare v_i number(8); v_j number(8):=1; v_n number(8):=0; begin for v_i in 1..100 loop while v_j<=v_i loop if mod(v_i,v_j)=0 then v_n:=v_n+1; end if; v_j:=v_j+1; end loop; v_j:=0; if v_n=2 then dbms_output.put_line(v_i); end if; v_n:=0; end loop; end;
pl/sql練習案例