PL/SQL筆記

(Procedure Language/SQL)
1.輸出一個字符串
declare   --說明部分,定義一些變量
begin     --程序
dbms_output.put_line('Hello World!');
end;

set serveroutput on  --對存儲過程進行調試,便於輸出

2.大數據框架
Hadoop框架-->Java基礎
Spark框架-->Scala語言

3.PLSQL定義變量定義,變量名在前,類型在後面
var char(15);
married boolean:=true;
psal number(7,2);
my_name emp.ename%type;引用型變量,引用emp.enmae的類型作爲類型
emp_rec emp%rowtype;記錄型變量,引用一行的類型作爲類型,可以理解爲數組

4.PLSQL的賦值
1)使用:=
2)使用into
3)使用=>

5.if語句
if...then...
    elseif... then...;
    elseif... then...;
    elseif... then...;
    else''';
end if;

6.接受鍵盤輸入
accept num prompt '請輸入一個數字';
--變量num是一個地址值,在地址值上保存了輸入的值
pnum number:=&num
--隱式轉換爲數字

7.循環,一共有三種
1)while循環,類似於Java中的while循環
   while total <=25000
   loop
   ...
   total:=total+salary;
   end loop;
2)do while循環,類似於Java中的do while循環,易於控制光標
   loop
   exit(when 條件);
   ...
   end loop;
3)for循環,類似於Java中的for循環
   for i in 1...10
   loop
語句序列;
end loop;

8.遊標CURSOR代表集合,類似於Java中的ResultSet。
語法:
cursor cursorname [(param datatype,param datatype,...)] 
is select * from user
使用步驟:
1)打開遊標:open c1;
2)取一行遊標的值:fetch c1 into pjob;
3)關閉遊標:close c1;
4)遊標結束的方式 exit when c1%notfound
5)上面的pjob必須與user表中的job列類型一致
遊標的屬性:
1)%isopen是否打開
2)%rowcount影響的行數
3)%found找到了就是true
4)%notfound沒找到就是false

9.異常,不要往上拋異常
1)系統定義異常
no_data_found:沒有找到數據
too_many_rows:select..into語句匹配多個行
zero_divide:被0除
value_error:算術或轉換錯誤
timeout_on_resource:在等待資源時發生超時
2)自定義異常
declare
  cursor cemp is select ename from enp 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 minitor),進程失敗,該進程會自動啓動,清除緩存,釋放資源
  close cemp;
end;

10.存儲過程:沒有返回值,使用out參數也可以有返回值
create or replace procedure procedurename
is(as)--類似於declare
PLSQL subordinate program
begin
end;

11.存儲函數:有返回值
create or replace function functionname
return 函數值類型
is(as)--類似於declare
PLSQL subordinate program
begin
end functionname;

12.調用存儲過程的方式
1)execute、縮寫exec procedurename();
2)begin
     procedurename();
     procedurename();
   end;

13.帶參數的存儲過程,參數必須註明是輸入in還是輸出out;
一般不要在存儲過程中提交或者是回滾,誰調用存儲過程誰提交;

14.過程和函數中的in和out
如果只有一個返回值,就用存儲函數,否則用存儲過程。

15.使用存儲過程可以替代存儲函數
向下兼容,老版本數據庫存儲過程和存儲函數存在差異。

16.將對象置爲空值,會優先回收。

17.能否通過java代碼去幹預垃圾回收。
Java的gc不受代碼的控制
不能,Java的API有一個System類,有一個gc()方法,請求運行垃圾回收機制。
運行Java:
java -Xms100M -Xmx200M Helloworld
執行Helloworld這個程序所需要的最小堆內存100M,最大200M
垃圾回收什麼情況下有意義,沒有富裕的內存時纔有意義。

18.死鎖:線程的互相等待。
JDK:ThreadDump
Oracle:自動處理,自動回滾引起死鎖的會話。

19.申明包結構
create or replace package mypackage as
type empcusor is ref cursor;
procedure queryEmpList(dno in number,empList out empcursor)
end mypackage;

20.申明包體,實現包頭裏面的所有存儲過程和存儲函數
create or replace package body mypackage as
procedure queryEmpList(dno in number,empList out empcursor)
as
begin
open empList for select * from emp where deptno=dno;
end queryEmpList;
end mypackage;

21.Java中接口可以被實例化,通過匿名內部類。

22.觸發器
每當一個特定的數據操作語句(Insert,update,delete)在指定的表上發出時,Oracle自動的執行觸發器中定義的語句序列
create trigger firsttrigger
after insert
on emp
begin
    dbms_output.put_line('成功插入新員工。');
end;

23.觸發器可用於
1)數據確認
2)實施複雜的安全性檢查
3)做審計,跟蹤表上所做的數據操作等,例如:記錄日誌
4)數據的備份和同步

24.觸發器的類型
1)語句級的觸發器,針對表
在指定的操作語句操作之前或之後執行一次,不管這條語句影響了多少行
2)行級觸發器,針對行
觸發語句作用的每一條記錄都被觸發。在行級觸發器中使用:old和:new僞記錄變量,識別值的狀態

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