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
- 光標
- 光標的語法
- 光標的屬性
- 光標數的限制
- 帶參數的光標
- 例外(錯誤)
- 系統列外
- 自定義列外
- PL/SQL 基礎語法
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;