Oracle-PLSQL學習

  • 2019 年 11 月 21 日
  • 筆記

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/wangtongxue123456/article/details/79681868

  • PLSQL
    • PL/SQL 基礎語法
      • PL/SQL 的程序結構
      • IF 語句
      • 循環語句
        • 第一種 while
        • 第二種 loop
        • 第三種 FOR
    • 光標
      • 光標的語法
      • 光標的屬性
      • 光標數的限制
      • 帶參數的光標
    • 例外(錯誤)
      • 系統列外
      • 自定義列外

PLSQL

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

PL/SQL 基礎語法

PL/SQL 的程序結構

declare     說明部分(變量說明,光標申明,例外說明)  begin      語句序列(DML語句)  exception      例外處理語句  end;

說明部分 – ### 定義基本變量 – 類型:char,varchar2,date,number,boolean,long – 舉例:varl char(15); married boolean:=true; (變量名在前,類型在後)

  • ### 引用類型變量
  • 舉例:my_name emp.ename%tyoe;
--引用型變量  set serveroutput on  declare  --定義變量  --pename varchar2(20);  pid a.id%type;  pnum a.num%type;  begin  select id,num into pid,pnum from a where id='a';  --屬性  DBMS_OUTPUT.PUT_LINE(pid||'id'||pnum);  end;  /
  • ### 記錄型變量
  • 舉例:emp_rec emp%rowtype;
  • 記錄型變量分量的引用: emp_rec.ename:=』ADAMS』;
--打開顯示面板  set SERVEROUTPUT ON  DECLARE  --定義記錄型變量:注意代表一行  emp_rec A%rowtype;--A 表A  begin  --得到a id的信息  select * into emp_rec from A where id='a';  DBMS_OUTPUT.PUT_LINE(emp_rec.id);  end;  /

IF 語句

IF 條件 THEN 語句1;  語句2;  END IF;
IF 條件 THEN 語句序列1;  ESLE 語句序列2;  END IF;
IF 條件 THEN 語句;  ELSLF 語句 THEN 語句;  ELSE 語句;  END IF;

使用實例

/*   判斷用戶從鍵盤輸入的數字   1.如何使用if語句   2.接收一個鍵盤輸入(字符串)  */  set serveroutput on  --接受一個鍵盤輸入  --num:地址值,含義在該地址上保存了輸入的值  accept num prompt '請輸入一個數字'  declare  --定義變量保存用戶從鍵盤輸入的數字  pnum number:=#  begin  --執行if語句進行條件判斷  if pnum=0 then SYS.DBMS_OUTPUT.PUT_LINE('你輸入數字是0');  elsif pnum=1 then SYS.DBMS_OUTPUT.PUT_LINE('你輸入數字是1');  else SYS.DBMS_OUTPUT.PUT_LINE('你輸入的是什麼?');  end if;  end;

循環語句

第一種 while

WHILE total<=2500 LOOP  ...  END LOOP;

實例代碼

--使用while 循環打印數字的1-10  set serveroutput no  declare  --定義循環變量  pnum number:=1;  begin  while pnum<=10 loop  --循環體  dbms_output.put_line(pnum);  pnum:=pnum+1;  end loop;  end;

第二種 loop

Loop  EXIT [WHEN 條件];  ...  END LOOP;

實例代碼

--使用loop 循環打印1-10  set serveroutput no  declare  --定義變量  pnum number:=1;  begin  loop  -- 退出條件:循環變量大於10  exit when pnum>10;  --打印該變量的值  DBMS_OUTPUT.PUT_LINE(pnum);  --循環變量+1  pnum:=pnum+1;  end loop;  end;

第三種 FOR

FOR I IN 1..3 loop  語句序列;  sdsdfsdafasdfend loop;

實例代碼

--使用for循環打印1-10  set serveroutput on  declare  --定義循環變量  pnum number:=1;  begin  for pnum in 1..10 loop   DBMS_OUTPUT.PUT_LINE(pnum);  end loop;  end;

光標

光標的語法

CURSOR 光標名[(參數名 數據類型,[參數名 數據類型])]    IS SELECT 語句;    -- 打開光標  open c1;  -- 關閉光標  close c1;  -- 取一行光標的值  fetch c1 into pename;(取一行到變量中)

fetch 的作用,1、把當前指針指向的記錄返回。2、將指針指向下一條記錄 實例

--查詢並打印員工給的姓名和薪水  /*  光標的屬性,光標的屬性共有4個  %found   光標取到值為true  %notfound 光標取不到值true  */  set SERVEROUTPUT ON    declare  --定義一個光標  cursor ca is select id,num from a;  --為光標定義對應的變量  pid a.id%type;  pnum a.num%type;  begin  --打開光標  open ca;    loop      fetch ca into pid,pnum;      --      exit when ca%notfound;      DBMS_OUTPUT.PUT_LINE(pid||'的值'||pnum);      end loop;  --關閉光標  close ca;  end;

光標的屬性

  • %found 光標取到值為true
  • %notfound 光標取不到值true
  • %isopen 判斷光標是否打開
  • %rowcount 影響的行數

光標數的限制

默認情況下,oracle 數據庫只允許打開300個光標 show parameter cursor –查看光標數 alter system set open_cursors=』400』 scope=』both』 scope 的取值:both memory spfile(數據庫需要重啟生效)

帶參數的光標

CURSOR 光標名[(參數名 數據類型,[參數名 數據類型])]    IS SELECT 語句;

實例

--查詢某個部門中員工的姓名  set serveroutput on  declare  --定義嗲參數的光標  cursor ca(d char) is select id from a where id=d;  pid a.id%type;  begin    open ca('a');    loop      fetch ca into pid;      exit when ca%notfound;      SYS.DBMS_OUTPUT.PUT_LINE(pid);    end loop;    close ca;  end;

例外(錯誤)

例外是程序設計語言提供給的一種功能,用來增強程序的健壯性和容錯性。

系統列外

No_data_found (沒有找到數據) 實例

--系統例外:no_data_found  set SERVEROUTPUT ON  declare   pename a.id%type;  begin    select id into pename from a where num=5;  exception   when no_data_found then DBMS_OUTPUT.PUT_LINE('沒有這個員工');   when others then SYS.DBMS_OUTPUT.PUT_LINE('其他例外');  end;

Too_many_rows (select … into 語句匹配多個行)

Zero_Divide (被零除)

Value_error (算術或轉換錯誤)

Timeout_on_resource (在等待資源時發生超時)

自定義列外

  • 定義變量,類型是 exception
  • 使用raise拋出自定義列外
--自定義例外:  set serveroutput on    declare  cursor ca is select id from a where num=123;  pid a.id%type;  --自定義例外  no_num_found exception;  begin    open ca;    fetch ca into pid;    if ca%notfound then    --跑出例外    raise no_num_found;    end if;    close ca;  exception    when no_num_found then SYS.DBMS_OUTPUT.PUT_LINE('沒有num');    when others then SYS.DBMS_OUTPUT.PUT_LINE('其他例外');  end;