PL/SQL 基礎學習

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;
/
相關文章
相關標籤/搜索