Oracle PL/SQL 基礎用法 教學

記錄會使用到的 pl/sql 寫法與方式

1. PL/SQL語法格式

declare
  -- 宣告變數/cursor
begin
  -- 程式執行/邏輯
exception
  -- 例外錯誤處理
end;

2. 變數宣告與初始值

declare
  v_count1 int; -- 宣告 v_count1變數為 int型式
  v_count2 int := 0; -- 宣告 v_count2變數為 int並設定初始值為0
  v_string varchar2(200) := 'SYSTEM'; -- 宣告 v_string變數為 varchar2,長度為200並設定初始值為 'SYSTEM'
  u_id     dba_users.user_id%type := 1; -- 宣告 u_name類型同表 dba_users.user_id欄位類型,並初始值為1
  u_name   dba_users.username%type; -- 宣告 u_name類型同表 dba_users.username欄位類型
  u_status dba_users.account_status%type; -- 宣告 u_name類型同表 dba_users.account_status欄位類型
begin
  select 1 into v_count1 from dual; -- 利用 select查詢出來結果,存入 v_count1變數
  select username, account_status into u_name, u_status from dba_users where user_id = u_id; -- 將查詢出來結果存入 u_name, u_status變數,並用 u_id變數做條件查詢
  --
exception
  --
end;

3. 程式執行/邏輯

declare
  v_count int := 0;
begin
  select count(1) into v_count from dba_users; -- 將查出來的數量存入 v_count變數
  if v_count > 10 then -- if邏輯判斷
    dbms_output.put_line('User counts over 10:' || v_count); -- 利用 dbms_output來輸出訊息,文字連結使用||符號
    execute immediate 'insert into check_accounts values (sysdate, '|| v_count ||')'; -- 執行 insert sql
  end if;
  begin -- 外層程式執行/邏輯部份,可再包一個PLSQL架構,程式出錯時,只會在內部,而不影響外層
    --
  exception
    --
  end;
exception
  --
end;

4. 例外錯誤處理 (僅列出常見的錯誤項目)

declare
  --
begin
  ...
  raise cust_exception;
exception
  when no_data_found then -- 找不到資料時
    dbms_output.put_line('no_data_found:' || sqlerrm);
  when too_many_rows then -- 回傳不止一筆資料時
    dbms_output.put_line('too_many_rows:' || sqlerrm);
  when zero_divide then -- 除數為0時
    dbms_output.put_line('zero_divide:' || sqlerrm);
  when invalid_number then -- 當字串轉為數字但無法成為有效數值時
    dbms_output.put_line('invalid_number:' || sqlerrm);
  when cust_exception then -- 自定義 exception
    dbms_output.put_line('cust_exception: custom excpetion content');
  when others then -- 以上狀況無法解決的其他狀況 (放到最後)
    dbms_output.put_line('others:' || sqlerrm);
end;

5. 資料處理 cursor query

declare
  cursor q_users is -- cursor查詢的 query內容
    select username, account_status 
    from dba_users;
begin
  for rec in q_users -- 以LOOP循環方式,逐筆處理
  loop
    if rec.account_status = 'LOCKED' then
      dbms_output.put_line('Username: ' || rec.username || ' is locked.');
    else
      dbms_output.put_line('Username: ' || rec.username || ' is normal.');
    end if;
  end loop;
exception
  when others then
    dbms_output.put_line('others:' || sqlerrm);
end;

6. 邏輯與判斷 (if & case)

declare
  cursor q_users is
    select username, account_status 
    from dba_users;
begin
  for rec in q_users
  loop
    if rec.username = 'SYS' then -- 用 if 來判斷資料
      pass;
    else
      case rec.account_status -- 用 case 選擇資料處理
        when 'LOCKED' then
          dbms_output.put_line('Username: ' || rec.username || ' is locked.');
        when 'EXPIRED' then
          dbms_output.put_line('Username: ' || rec.username || ' is normal.');
        when 'OPEN' then
          dbms_output.put_line('Username: ' || rec.username || ' is normal.');
      end case;
    end if;
  end loop;
exception
  when others then
    dbms_output.put_line('others:' || sqlerrm);
end;

 

已轉向 blogger 記錄

https://slowlife-notes.blogspot.com