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;
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