[Oracle之plsql] plsql初步學習、瞭解遊標、存儲過程、函數、觸發器等概念

plsql 編程:

什麼是plsql編程:

一種過程化sql語言(procedural language/ sql)
pl/sql 是 oracle 數據庫對sql語句拓展,在普通的sql語句中添加編程語言的特點,通過邏輯判斷,循環實現複雜功能
pl/sql結構
pl/sql程序以塊(block)爲單位,整個plsql分三個部分:聲明部分、執行部分、異常處理
語法:

    declare
   --           聲明區:聲明一些變量、遊標等
   begin
   -- 執行部分:
    exception --不是必須的
    end; --結束

語法規範:
 1.標識符規範:
不能超過30個字符、不區分大小寫、不能使用減號、不能使用sql關鍵詞、變量名聲明儘量不要和表中的字段一致[因爲有可能會出錯]
2.變量類型:
char, varchar2, date, number, boolean, long
%type:與表中的字段數據類型是一致的,相當於動態獲取表中字段數據類型
定義語法: varl char(15);
3.運算符:
大部分與java一致 唯一不同的是賦值不同
+ - * / 常用運算符號
…  範圍符號(1…10)
:=  賦值運算符
||   字符連接符

初試plsql

declare
v_name varchar2(50);
v_name2 varchar2(50) := '張三';
v_name3 varchar2(200) := &testName;
--&名稱[名稱隨意取] 手動輸入內容賦值
--如果輸入字符串 加''
begin

Dbms_Output.put_line(v_name2);
Dbms_Output.put_line(v_name3);

--通過查詢語句對plsql中的變量賦值
select ename into v_name from emp where empno = &emp_id;
Dbms_Output.put_line(v_name);

end;
if判斷:

語法:
if 表達式 then 處理1
elsif 表達式2 then 處理2
else 其他情況
end if;
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NuLNgLPg-1574848634293)(en-resource://database/2941:0)]

case表達式

case
when 表達式1 then 結果1
when 表達式2 then 結果2

else 默認結果
end; --case 結束

declare
   v_score number(10, 2) := &inputScore;
   v_result char(1);
begin
 v_result :=
   case 
   when v_score > 90 and v_score <= 
100
     then 'A'
   when v_score > 60 and v_score <=90
     then 'B'
   else 'C'
   end; --結束case的
   Dbms_Output.put_line(v_result);
end;

遊標:

遊標是屬於sql的內存工作區,用於臨時存放從數據庫中提取的數據集合。(相當於是一個數據集合)
遊標的狀態:
%notfound 最近一次讀取不成功返回true
%found 最近一次讀取成功返回true
%rowcount 數據類型, 返回已從遊標中讀取條數
%isopen 判斷是否開啓 boolean

案例:使用遊標方式輸出emp表中的員工信息

declare
    cursor c1 is select * from emp;
    rowinfo emp%rowtype;
begin
    open c1;
    loop
      fetch c1 into rowinfo;
      exit when c1%notfound;
      dbms_output.put_line(rowinfo.empno || '====' || rowinfo.ename);
    end loop;
    close c1;
end;

遊標的for循環:
遊標for循環語句,自動執行遊標中的open,fetch,close操作

for 遊標中的變量 in 遊標名[(參數1,…)]

--遊標使用for循環

--v_emp是一個臨時變量 存儲的是遊標中存儲結果集每一行數據 類似java 增強for
declare
    cursor emp_cursor(v_sal number default 1) is select * from emp where sal > v_sal;
begin
    for v_emp in emp_cursor(&v_sal)
    loop
      DBMS_output.put_line(
      v_emp.ename || '==' || v_emp.job || '==' || v_emp.sal);
    end loop;
end;

存儲過程

什麼是存儲過程?
是一個數據庫對象,是一組爲完成特定功能的pl/sql語句集合。
創建語法:create procedure 存儲過程名[(參數1,…)]
{is | as}
變量聲明區 declare
begin
執行的內容(可以包含很多個pl/sql語句段)
exception
end;
參數類型:in 輸入參數 out 輸出參數 in out 輸入輸出
存儲過程優缺點?
1.存儲過程是預編譯的,可以防止sql注入,一次編譯多次執行,提高效率,提高安全性。
2.可以將多個複雜的sql語句封裝成存儲過程,可以減少代碼的複雜度,也可以減少數據庫的連接次數,提高性能、效率。
3.存儲過程給用戶設定權限,較高的安全性。

缺點:調試比較麻煩,不方便維護和移植
創建存儲過程:

--創建存儲過程
create or replace procedure emp_proc(v_name in varchar2, v_salary out emp.sal%type)
--參數類型有三種    in 輸入參數   out輸出參數  in out 輸入輸出參數
as
--聲明區  如果沒有變量可以省略
--執行區
begin
  --多個plsql語句段
  update emp set sal = sal + 500 where ename = v_name;
  select sal into v_salary from emp where ename = v_name;
end;

存儲過程調用:
plsql調用:

declare
        v_salary  emp.sal%type;
begin
        emp_proc(&v_name, v_salary);
        Dbms_Output.put_line('新的工資' ||  v_salary);
end;

jdbc調用

    String sql = "{call 存儲過程名(?, ?, ?, ...)}";
    CallableStatement state = conn.prepareCall();
    給問號傳參。。。

hibernate、mybatis如何調用?
框架本身會對對應類方法實現存儲過程。


函數:

函數類似存儲過程,函數是一個命名程序,可以帶參數,並返回結果(必須有一個return結果)
語法:

    create [or replace] function 函數名[(參數1, 參數2...)]
    return 返回數據類型
    {is | as}
    --變量聲明區  不需要declare
    begin 
     執行的內容(可以包含很多個pl/sql語句段)
     exception
    end;

函數調用:

1.使用plsql調用

declare
  v_count number;
begin
  v_count := empcount;
  Dbms_Output.put_line(v_count);
end;

2.使用sql語句調用

select empcount from dual;

函數和存儲過程的區別:

1.函數必須有一個返回值,存儲過程不需要
2.函數可以在sql語句中使用,而存儲過程不能,但是可以通過代碼在java程序中使用
如:select empcount from dual在虛擬表中調用函數


觸發器:

觸發器是一段plsql對象,由事件觸發,不需要調用,不接受參數
語法:create [or replace] trigger 觸發器名
{before | after} --事件之前或者之後
{insert | update | delete} --觸發事件
on 表名

[for each row] --對每行數據修改都會觸發
begin
執行的處理

--定義觸發器
create or replace trigger emp_trigger
before --觸發時機       之前
insert --執行插入時會觸發       代表觸發的事件
on emp --指定哪張表
for each row -- 對每行數據都起作用
declare
    v_next number;
begin
    select goodz.nextval into v_next from dual;
    --將新的主鍵列通過v_next賦值
    :new.empno := v_next;
    Dbms_Output.put_line('執行觸發器' || v_next);
end;

數據庫備份和還原

1.藉助於plsql工具進行導入導出
2.藉助於cmd命令進行備份還原(需要安裝環境變量)

導出命令
exp 用戶/密碼/@ip/實例 file=導入路徑.dmp
log=日誌文件.log
如: exp scott/admin@localhost/xe file=d:/a.dmp log=d:/b.log
導入命令
lmp 用戶/密碼@ip/實例 file=還原文件.dmp
full=y --完全還原
ignore=y – 有錯誤忽略
log=日誌文件.log

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