標籤:open into 語句 數組 fetch ram sys 匹配 alter
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: