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;