1. 程式人生 > >Oracle PLSQL:

Oracle PLSQL:

source line alter 其他 emp if語句 close divide rom

PLSQL:
  符號:
    賦值: :=

  基本示例:

        set serveroutput on   //設置輸出打開.
        declare
          --說明部分
          
        begin
          --程序
          dbms_output.put_line(Hello World);
        exception
        
        end;
        /


  引用型變量:
    --查詢7839的姓名和薪水

        --查詢7839的姓名和薪水
        
set serveroutput on declare --定義變量保存姓名和薪水 --pename varchar2(20); --psal number; pename emp.ename%type; //引用型變量 psal emp.sal%type;       begin --得到姓名和薪水 select ename,sal into pename,psal from emp where empno=7839
; dbms_output.put_line(pename||的薪水是||psal); end; /


  記錄型變量(代表了一行,多個列,類似數組)
    --查詢7839的姓名和薪水

        set serveroutput on

        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; /


  IF語句
    --判斷用戶從鍵盤輸入的數字

        set serveroutput on

        --接收鍵盤輸入
        --num: 地址值,在該地址上 保存了輸入的值
        accept num prompt 請輸入一個數字;  //accept 命令

        declare
          --定義變量保存輸入的數字
          pnum number := #            //從地址上取出數字 使用 &
        begin
          if pnum = 0 then dbms_output.put_line(您輸入的是0);
            elsif pnum = 1 then dbms_output.put_line(您輸入的是1);
            elsif pnum = 2 then dbms_output.put_line(您輸入的是2);
            else dbms_output.put_line(其他數字);
          end if;
        end;
        /

  循環語句(共有三種方式,此處舉例一種):
    --打印1~10

        set serveroutput on

        declare
          pnum number := 1;
        begin
          loop
            --退出條件
            exit when pnum > 10;
            
            dbms_output.put_line(pnum);
            --加一
            pnum := pnum + 1;
          end loop;
        end;
        /

  Cursor:光標(相當一個resultset, 結果集):
    1. 光標的屬性:
      %isopen   %rowcount (影響的行數)
      %found    %notfound
    2. 默認,一個會話中只能打開300個光標
       show parameter cursor //查看參數 --->後面兩個都是這裏查來的
      修改: alter system/session 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;
            /

    例二(帶參數):
      --查詢某個部門的員工姓名

            set serveroutput on

            declare
              cursor cemp(dno number) is select ename from emp where deptno=dno;
              pename emp.ename%type;
            begin
              open cemp(20);     //傳參
              loop
                fetch cemp into pename;
                exit when cemp%notfound;
                
                dbms_output.put_line(pename);

              end loop;
              close cemp;
            end;
            /

exception(例外)
  系統例外:
    No_data_found (沒有找到數據)
    Too_many_rows (select into 語句匹配多個行)
    Zero_Divide (被 0 除)
    Value_error (算數或者轉換異常)
    Timeout_on_resource (等待資源超時)

    --被0除
    

                set serveroutput on

                declare
                  pnum number;
                begin
                  pnum := 1/0;
                  
                exception
                  when zero_divide then dbms_output.put_line(1:0不能做分母);
                                         dbms_output.put_line(2:0不能做分母);
                  when value_error then dbms_output.put_line(算術或者轉換錯誤);
                  when others then dbms_output.put_line(其他例外);
                end;
                /

  自定義例外:
    --查詢50號部門的員工姓名

                set serveroutput on

                declare
                  cursor cemp is select ename from emp where deptno=50;
                  pename emp.ename%type;
                  
                  --自定義例外
                  no_emp_found exception;   //定義一個 例外 類型的變量
                begin
                  open cemp;

                  --取第一條記錄
                  fetch cemp into pename;
                  
                  if cemp%notfound then
                    --拋出例外
                    raise no_emp_found;    //拋出例外
                  end if;

                  --pmon: process monitor
                  close cemp;
                  
                exception      //一般處理是保存到一個表中
                  when no_emp_found then dbms_output.put_line(沒有找到員工);
                  when others then dbms_output.put_line(其他例外); 
                end;
                /

Oracle PLSQL: