1. 程序結構:sql
-- 聲明部分 declare -- 聲明變量 遊標等 -- 程序開始 begin --程序體 -- 程序結束 end; /
2. 打開屏幕輸出開關ide
set serveroutput on
3. 聲明變量(在declare部分):oop
3.1. 變量名 類型(長度);fetch
example varchar2(30);
能夠直接賦值。code
example number := 38;
3.2 變量名 表名.字段%type; server
example dept.deptno%type;
注意:引用類型變量引用某個表具體字段類型和長度,比較靈活,缺點是不易讀,賦值一旦超出類型長度,將會報錯,具體長度受源表字段影響。超出後報"ORA-06502: PL/SQL: 數字或值錯誤 : 字符串緩衝區過小"
3.3 記錄型變量 變量名 表名%rowtype; 資源
emp_rec emp%rowtype; -- 賦值: select * into emp_rec from emp where empno = 7839; --取值: dbms_output.put_line(emp_rec.empno || emp_rec.ename);
4. 變量賦值(在begin內部):字符串
4.1 變量名 := 具體值;it
example := 'hello world';
4.2 經過SQL語句賦值io
select deptno into example from dept d where d.deptno = 20;
注意:查到結果集要和變量匹配,假如查到多行數據,賦值給一行,將會報"ORA-01422: 實際返回的行數超出請求的行數"
5. 打印語句
dbms_output.put_line(打印內容或變量);
鏈接使用 "||"
6. if語句
SET SERVEROUTPUT ON ACCEPT NUM PROMPT '請輸入一個數字'; DECLARE pnum NUMBER := # BEGIN IF pnum = 0 THEN dbms_output.put_line('剛纔輸入的數字是0'); ELSIF pnum = 1 THEN dbms_output.put_line('剛纔輸入的數字是1'); ELSE dbms_output.put_line('剛纔輸入的數字是' || pnum); END IF; END; /
以IF 表達式 THEN 具體語句,能夠有多條;
ELSIF 表達式 THEN 具體語句;
ELSE 語句;
END IF;
7. 循環
set serveroutput on declare pnum number := 1; begin -- 循環輸出1到10 while pnum <= 10 loop dbms_output.put_line(pnum); -- 變量加1 pnum := pnum +1; end loop; end; /
推薦使用下面這種循環,方便控制遊標
set serveroutput on declare pnum number := 1; begin -- 循環輸出1到10 loop -- 當表達式知足時,不在進行循環 exit when pnum = 10 ; dbms_output.put_line(pnum); -- 變量加1 pnum := pnum +1; end loop; end; /
for循環:
SET SERVEROUTPUT ON DECLARE pnum NUMBER := 1; BEGIN -- 循環輸出1到10 FOR I IN 1..10 LOOP dbms_output.put_line(pnum); -- 變量加1 pnum := pnum +1; END LOOP; END; /
1...10 表明1到10
8. 遊標(光標)
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 cemp%notfound; dbms_output.put_line(pename || '的薪水是' || psal); end loop; -- 關閉遊標,釋放資源 close cemp; end; /
注意:fetch語句位於loop下一行,若是位於exit when下面,循環多執行一次。 10,20,30,40,40
先打開光標,而後loop,取出光標,設置結束條件,具體代碼,結束循環,關閉遊標。
9. 異常
SET SERVEROUTPUT ON DECLARE pnum NUMBER; pname emp.ename%TYPE; cursor cemp is select ename from emp where empno = 555555; no_emp_found exception; BEGIN -- 1. zero_divide --pnum := 3 / 0; -- 2. value_error --pnum := 'rrrr'; -- 3. too_many_rows --select ename into pname from emp; -- 4. no_data_found --select ename into pname from emp e where E.empno = 62155555553; OPEN cemp; FETCH cemp INTO pname; IF cemp%notfound THEN dbms_output.put_line('--cemp not found'); -- 5. user define exception raise no_emp_found; END IF; IF cemp%notfound THEN CLOSE cemp; END IF; EXCEPTION WHEN zero_divide THEN dbms_output.put_line('--zero'); WHEN value_error THEN dbms_output.put_line('--value error'); WHEN too_many_rows THEN dbms_output.put_line('--too many rows'); WHEN no_data_found THEN dbms_output.put_line('--no data found'); WHEN no_emp_found THEN dbms_output.put_line('-- user exception'); WHEN OTHERS THEN dbms_output.put_line('--others exception'); END; /