oracle PLSQL編程

1 . 什麼是pl/sql?

  pl/sql是oracle對sql語言的過程化擴展,指在sql命令語言中增加了過程處理語句(如分支,循環等),使sql語言具有過程處理能力。

2 .變量

      普通數據類型(char,varchar2,date,number,boolean,long)

      特殊變量類型(引用類型變量,記錄型變量)

  普通變量:

       1. 直接複製語句 := 如:v_name='zhangsan'

       2. 語句賦值,使用select...into ...賦值: (語法 select 值 into 變量)

       【實例】

-- 打印個人信息,包括:姓名,薪水,地址
declare
--姓名
  v_name varchar2(20) :='zhangsan';
  --薪水
  v_sal number;
  --地址
  v_address varchar2(50);
begin
  -- 直接賦值
  v_sal:=8000;
  --語句賦值
  select '貴陽市觀山湖區' into v_address from dual;
  --打印輸出
  dbms_output.put_line('姓名:'||v_name||',薪水:'||v_sal||',地址:'||v_address);
end;

引用型變量

    變量的類型和長度取決於表中字段的類型和長度

     通過表名.列名%TYPE指定變量的類型和長度,如: v_name emp.ename%TYPE;

 【案例】

   

-- 引用型變量打印個人信息,包括:姓名,薪水, 查看emp表ename,sal賦值給定義的變量,v_name的長度,類型取決於emp.ename長度
declare
--姓名
  v_name emp.ename%TYPE;
  --薪水
  v_sal emp.sal%TYPE;
begin
  --語句賦值
  select ename,sal into v_name,v_sal from emp where empno=7839;
  --打印輸出
  dbms_output.put_line('姓名:'||v_name||',薪水:'||v_sal);
end;

引用型的好處:

 使用普通變量定義方式,需要知道表中列的類型,而使用引用類型,不需要考慮類的類型和長度,使用%TYPE是非常號的編程風格,因爲它使得PL/SQL更加靈活,更加具有對數據庫定義的更新


 

記錄型變量

   接收表中一整行記錄,相當於java中的一個對象

   語法:變量名稱  表名%ROWTYPE, 例如: v_emp emp%rowtype;

【案例】

-- 記錄型變量打印個人信息,包括:姓名,薪水
declare
--記錄型變量接收一行
  v_emp emp%ROWTYPE;
begin
  --語句賦值
  select * into v_emp from emp where empno=7839;
  --打印輸出
  dbms_output.put_line('姓名:'||v_emp.ename||',薪水:'||v_emp.sal);
end;

如果有一個表,有100個字段,那麼程序如果要使用這100個字段,如果使用引用型變量一個個聲明,會特別麻煩,記錄型變量可以方便的解決這個問題

錯誤的使用;

記錄型變量只能存儲一個完整的行數據


流程控制

  語法: 

     begin

        if 條件1 then 執行1

         elsif 條件2 then 執行2

         else 執行3

   end if;

declare
  --聲明接收的數量
  v_count number;
begin
  select count(1) into v_count from emp;
  if v_count > 20 then
    dbms_output.put_line('emp表中的數量超過20條爲:' || v_count);
  elsif v_count >= 10 then
    dbms_output.put_line('emp表中的數量在10-20之間,條爲:' || v_count);
  else
    dbms_output.put_line('emp表中的數量小於10條爲:' || v_count);
  end if;
end;

循環

  在ORACLE中有三種循環方式,這裏只介紹一種:loop循環

  語法

        BEGIN

            LOOP

                 EXIT WHEN 退出循環條件

             END LOOP;

      END;

  【案例】

--循環打印1-10
declare
  --聲明循環變量
  v_num number := 1;
begin
  loop
    exit when v_num > 10;
    dbms_output.put_line(v_num);
    --循環變量的自增
    v_num := v_num + 1;
  end loop;
end;

無參遊標

  什麼是遊標?

    用於臨時存儲一個查詢返回的多行數據(結果集,類似於java的jdbc連接返回的ResultSet集合),通過遍歷遊標,可以逐行訪問處理該結果集的數據。

遊標的使用方式:聲明--->打開--->讀取--->關閉

1 .  語法

  遊標聲明:

  CURSOR 遊標名【參數列表】 IS 查詢語句;

  遊標的打開:

  OPEN 遊標名:

  遊標的取值:

  FETCH  遊標名  INTO  變量列表:

  遊標的關閉:

  CLOSE  遊標名;

2 . 遊標的屬性

  遊標的屬性              返回值類型                說明

  %ROWCOUNT         整型                         獲得FETCH語句返回的數據行數

  %FOUND                 布爾型                     最近的FETCH語句返回一行數據則爲真,否則爲假

  %NOTFOUND          布爾型                     與%FOUND屬性返回值相反

  %ISOPEN                 布爾型                       遊標已經打開時值爲真,否則爲假

3 .創建和使用

--使用遊標查詢emp表中員工名字,工資並且打印出來
declare
  --聲明遊標
  cursor c_emp is
    select ename, sal from emp;
  --聲明變量接收遊標的數據
  v_name emp.ename%TYPE;
  v_sal  emp.sal%TYPE;
begin
  --打開遊標
  open c_emp;
  --遍歷遊標
  loop
    --獲取遊標中的數據
    fetch c_emp
      into v_name, v_sal;
    --退出循環條件  %NOTFOUND:表示沒有數據, 則退出循環
    exit when c_emp%NOTFOUND;
    --輸出
    dbms_output.put_line('姓名:' || v_name || ',薪水:' || v_sal);
  end loop;
  --關閉遊標
  close c_emp;
end;

有參遊標

--使用帶參數遊標查詢emp表中員工名字,工資並且打印出來, 如果說打開遊標傳入的參數爲10,則值查詢empno=10的所有員工
declare
  --聲明遊標
  cursor c_emp(v_deptno emp.empno%TYPE) is
    select ename, sal from emp where deptno = v_deptno;
  --聲明變量接收遊標的數據
  v_name emp.ename%TYPE;
  v_sal  emp.sal%TYPE;
begin
  --打開遊標
  open c_emp(10);
  --遍歷遊標
  loop
    --獲取遊標中的數據
    fetch c_emp
      into v_name, v_sal;
    --退出循環條件  %NOTFOUND:表示沒有數據, 則退出循環
    exit when c_emp%NOTFOUND;
    --輸出
    dbms_output.put_line('姓名:' || v_name || ',薪水:' || v_sal);
  end loop;
  --關閉遊標
  close c_emp;
end;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章