oracle數據庫——plsql基本語法 流程控制及練習 循環結構

  1. plsql基本語法
    plsql 就是在sql語句中增加了變量,流程控制,函數,使得sql語句具有更強大的功能
    基本結構:

     declare
     定義變量
     begin
     select * from 表;--執行會報錯,可以增刪改,但查的時候要用into
     select xxx into v_xxx from 表 where xxx;
     end;
    

emp%rowtype 行類型
emp.sal%type 和emp表中sal列的類型一樣
record 記錄集類型

例如:

直接賦值
  declare 
    v_name varchar2(50);
  begin
     v_name:='熊二';
     dbms_output.put_line(v_name);
  end;
  
  用'/'來執行

  打開輸出功能:
set serveroutput on;

根據查詢結果來賦值
declare 
    v_name varchar2(50);
  begin
     select ename into v_name from emp where empno=7782;
     dbms_output.put_line(v_name);
  end;

  根據鍵盤輸入來賦值
  declare 
    v_name varchar2(50);
  begin
     v_name:='&輸入姓名';
     dbms_output.put_line(v_name);
  end;
  
  
  輸入部門編號,查詢部門工資最高的員工姓名和職位
  declare 
    v_deptno number(5);
    v_ename varchar2(20);
    v_job varchar2(30);
  begin
     v_deptno:=&輸入部門編號;
     select ename,job  into v_ename,v_job from emp where sal=
     (
         select max(sal) from emp where deptno=v_deptno
     );
     dbms_output.put_line(v_deptno||'部門工資最高的員工是:'||v_ename||'  職位:'||v_job);
  end;
  

  
  根據員工編號去查名字
寫法1:
   declare 
    v_name varchar2(50);
  begin
     select ename into v_name from emp where empno=&empno;
     dbms_output.put_line(v_name);
  end;
  
  寫法2:
參照某一列的數據類型去定義數據類型
   declare 
    v_name emp.ename%type;
  begin
     select ename into v_name from emp where empno=&empno;
     dbms_output.put_line(v_name);
  end;
  
  參照某一行的數據類型,有多少列就定義多少變量
  declare 
     v_emprow emp%rowtype;
   begin
   select * into v_emprow from emp where empno=&empno;
   dbms_output.put_line(v_emprow.ename || v_emprow.job);
   end;
  
  
   定義一個數據類型,參照其他表中的數據類型
  declare 
     type MyType is record
     (
         t_empno emp.empno%type,
         t_ename emp.ename%type,
         t_job emp.job%type,
         t_sal emp.sal%type
     );
     v_emprow MyType;
   begin
   select empno,ename,job,sal into v_emprow from emp where empno=&empno;
   dbms_output.put_line(v_emprow.t_ename || v_emprow.t_job);
   end;

2.流程控制

--if..else..
declare 
      v_job emp.job%type;
   begin
       select job into v_job from emp where empno=&empno; 
       if v_job='MANAGER' then
          dbms_output.put_line('是經理');
       else
          dbms_output.put_line('不是經理');
       end if;
   end;
--if..elsif..else..   
declare 
     v_sal emp.sal%type;
   begin
      select sal into v_sal from emp where empno=&no;
      if v_sal <=1000 then
         dbms_output.put_line('藍領');
       elsif v_sal <=2000 then
         dbms_output.put_line('白領');
       else
         dbms_output.put_line('金領');
       end if;
      end;


--case等值

declare 
       v_job emp.job%type;
      begin
          select job into v_job from emp where empno=&no;
          case
            v_job
          when 'CLERK' then   dbms_output.put_line('科員');
          when 'ANALYST' then   dbms_output.put_line('分析師');
          when 'SALESMAN' then   dbms_output.put_line('銷售員');
          when 'MANAGER' then   dbms_output.put_line('經理');
          when 'PRESIDENT' then   dbms_output.put_line('董事長');
          else dbms_output.put_line('不明職位');
          end case; 
      end;
   
   
 --case條件
    declare 
     v_sal emp.sal%type;
   begin
      select sal into v_sal from emp where empno=&no;
        case
          when v_sal>=3000 then dbms_output.put_line('金領');
          when v_sal>=2000 then dbms_output.put_line('白領');
          when v_sal>=1000 then dbms_output.put_line('藍領');
           else dbms_output.put_line('無領');
        end case;        
      end;

練習

1.輸入員工編號,如果工資高於他所在部門的平均工資,輸出工資較高,否則輸出工資較低   
declare
v_sal emp.sal%type;
v_deptno emp.deptno%type;
v_avgsal emp.sal%type;
begin
  select sal,deptno into v_sal,v_deptno from emp where empno=&no;
  select avg(sal) into v_sal from emp where deptno=v_deptno;
  dbms_output.put_line(v_sal||''||v_avgsal);
  if v_sal < v_avgsal then dbms_output.put_line('工資較低');
  else dbms_output.put_line('工資較高');
  end if;
  end;

方法2:
declare
v_sal emp.sal%type;
v_empno emp.empno%type;
v_avgsal emp.sal%type;
begin
  v_empno:=&empno;
select sal into v_sal from emp where empno=v_empno;
select avg(sal) into v_avgsal from emp where deptno= 
(
select deptno from emp where empno=v_empno
);
 if v_sal < v_avgsal then dbms_output.put_line('工資較低');
  else dbms_output.put_line('工資較高');
  end if;
end;
2.輸入一個員工編號,輸出他入職的季節

declare
v_hiredate emp.hiredate%type;
v_month number(4);
begin
select hiredate into v_hiredate from emp where empno=&no;
select to_number(to_char(v_hiredate,'mm')) into v_month from dual;
case 
when v_month >3 and v_month<6 then dbms_output.put_line('春');
when v_month >6 and v_month<9 then dbms_output.put_line('夏');
when v_month >9 and v_month<12 then dbms_output.put_line('秋');
else dbms_output.put_line('冬');
end case;
end;


方法2:
declare
v_month number(4);
begin
select to_number(to_char(hiredate,'mm')) into v_month from emp where empno=&no;
case 
when v_month between 1 and 3 then dbms_output.put_line('春');
when v_month between 4 and 6 then dbms_output.put_line('夏');
when v_month between 7 and 9 then dbms_output.put_line('秋');
when v_month between 10 and 12 then dbms_output.put_line('冬');
end case;
end;

3.循環結構
3.1.loop
語法:
LOOP
語句;
EXIT WHEN <條件>
END LOOP;

--輸出1到10
declare
v_i number(5);
begin
v_i:=1;
loop
dbms_output.put_line(v_i);
v_i:=v_i+1;
exit when v_i>10;
end loop;
end;
--如果要使用put不換行的輸出,要結合put_line,否則可能看不到輸出結果
declare
v_i number(5);
begin
v_i:=1;
loop
dbms_output.put(v_i);
v_i:=v_i+1;
exit when v_i>10;
end loop;
dbms_output.put_line(' ');
end;

3.2.WHILE LOOP
語法:
WHILE <條件>
LOOP
語句;
END LOOP;

--與loop不同的是while loop把循環條件放到前面來
declare
v_i number(5);
begin
v_i:=1;
while v_i<=10 loop
dbms_output.put_line(v_i);
v_i:=v_i+1;
end loop;
end;

3.3.FOR
語法:
FOR <循環變量> IN 下限…上限
LOOP
語句;
END LOOP;

--從1循環到10
--當不需要定義變量時可以不寫declare
begin
for v_i in 1 .. 10
loop
dbms_output.put(v_i);
end loop;
dbms_output.put_line('');
end;

練習:

--輸出九九乘法表

begin
  for v_i in 1 .. 9
    loop
    for v_j in 1 .. v_i
      loop
        dbms_output.put(v_i||'*'||v_j||'='||v_i*v_j||' ');
        end loop;
        dbms_output.put_line('');
        end loop;
        end;
  

--輸出金字塔

               *
              ***
             *****
            *******
           *********
          ***********
 begin
 for v_i in 1 .. 6 loop
 dbms_output.put_line(lpad(lpad('*',2*v_i-1,'*'),6+v_i,' '));         
 end loop;         
 end;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章