1. 程式人生 > >Oracle---PL/SQL的學習

Oracle---PL/SQL的學習

PL/SQL程式

一.定義

declare

  說明部分

  begin

    語句序列(DML語句)

  exception

    例外處理語句

  end;

二. 變數和常量說明

a) 說明變數(char,varchar2,date,number,boolean,long)

  varl char(15);

  married boolean :=true;

  psal number(7,2);

  my_name emp.ename%type;引用型變數,my_name的型別與emp表中的ename列的型別一樣

  emp_rec emp%rowtype;記錄型變數

(一行的型別,是一個數組)

b) 記錄變數分量的引用:

  emp_rec.ename := ‘adams’;(陣列中的某一列)

 

例子:

declare

  --定義記錄型變數:代表一行

  emp_rec emp%rowtype;

begin

  select * into emp_rec from emp where empno=7839;

  dbms_output.put_line(emp_rec.ename ||’的薪水是’||emp_rec.sal);

end;

 

  c)定義常量   加個關鍵字

varl  constant  char(15);

 

三. IF語句

1.

  IF 條件 THEN 語句1;

  語句2

  END IF; 

2. 

  IF 條件THEN 語句序列1;

  ELSE 語句序列2;

  END IF;

3.

  IF 條件 THEN 語句;

  ELSIF 語句 THEN 語句;

  ELSE 語句;

  END IF;

 

  if 條件  then 語句

  elsif 條件 then 語句

  elsif 條件 then 語句

四. 迴圈語句

1. WHILE迴圈

while total <=25000

loop

.....

total :=total + salary;

end loop;

2. for in 迴圈

  FOR xxx  IN 1..3

  LOOP

  語句序列;

  END LOOP;

 

例子:

 

--列印1~10

set serveroutput on ;

 

declare

  pnum number := 1;

begin

  loop

    --退出條件

    exit when pnum > 10;

    DBMS_OUTPUT.PUT_LINE(pnum);

    -- 1

    pnum := pnum + 1;

    end loop;

end;

五.游標

--查詢並列印員工的姓名和薪水
/*
1. 游標的屬性:
  %isopen     %rowcount (影響的行數)
  %found      %notfound

2. 預設,一個會話中只能開啟300個游標
SQL> show parameter cursor

NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- -----------
cursor_sharing                       string                           FORCE
cursor_space_for_time                boolean                          FALSE
open_cursors                         integer                          300
session_cached_cursors               integer                          20

修改: alter system set open_cursors=400;

3. (思考):cursor_sharing 什麼作用?---> 效能優化
      EXACT(預設), FORCE, SIMILAR

*/
set serveroutput on

declare
  --定義游標
  cursor cemp is select ename,sal from emp;
  pename emp.ename%type;
  psal   emp.sal%type;
begin
  --開啟游標
  open cemp;

  loop
    --取一條記錄
    fetch cemp into pename,psal;
    --退出條件
    --exit when 沒有取到記錄;
    exit when cemp%notfound;

    dbms_output.put_line(pename||'的薪水是'||psal);

  end loop;
  
  --關閉游標
  close cemp;
end;

  漲工資例子:

--漲工資,總裁1000 經理800 其他400
set serveroutput on

declare 
  --alter table "SCOTT"."EMP" rename column "JOB" to empjob
  cursor cemp is select empno,empjob from emp;
  pempno emp.empno%type;
  pjob   emp.empjob%type;
begin
  rollback;

  open cemp;
  loop
    --取一條記錄
    fetch cemp into pempno,pjob;
    exit when cemp%notfound;
    
    --判斷職位
    if pjob = 'PRESIDENT' then update emp set sal=sal+1000 where empno=pempno;
      elsif pjob = 'MANAGER' then update emp set sal=sal+800 where empno=pempno;
      else update emp set sal=sal+400 where empno=pempno;
    end if;
    
  end loop;
  close cemp;
  
  --why?  ---> ACID
  commit;
  
  dbms_output.put_line('完成');
end;