一、什么是PL/SQL,它包含什么內(nèi)容
PL/SQL是過程語言與結(jié)構(gòu)化產(chǎn)村語言(SQL)結(jié)合而成的編程語言
1.包含:
①變量和類型
②控制語句
③子程序和函數(shù)
④對象類型和方法
二、PL/SQL體系結(jié)構(gòu)及執(zhí)行流程
1.將PL/SQL塊送給oracle服務(wù)器
2.oracle服務(wù)器啟動PL/SQL引擎
3.oracle過程語句 發(fā)送給 過程語句執(zhí)行器
4.執(zhí)行過程語句
5.引擎將 SQL語句 發(fā)送給 SQL語句執(zhí)行器
6.執(zhí)行SQL語句
7.將結(jié)果發(fā)送給客戶
三、關(guān)于PL/SQL塊
PL/SQL塊是構(gòu)成PL/SQL程序的基本單元,將邏輯上相關(guān)的聲明和語句合在一起
1.PL/SQL分為三個部分:
①聲明部分
②課執(zhí)行部分
③異常處理部分
語法:
[declare
declarations]
begin
executable statements
[exception
handlers]
end;
例如:設(shè)置變量v_name,利用程序包輸出同學(xué)們上午好
(||為連接符,等價于字符串中的+,:=為賦值,dbms_output,put_line為輸出語句)
declare
v_name varchar2(10):=’同學(xué)們’;
begin
dbms_output.put_line(v_name || ‘上午好’);
end;
四、變量和常量的聲明
語法:variable_name [cinstant] date_type[(size)] [:=init_value];
示例:constant 常量 date_type 數(shù)值類型
declare
v_name varchar2(20) :=’施敬超’; —姓名
v_sal number default 10000; —月收入
c_rate constant number(4,3):=0.037; —年利率
v_income number(10,3); —一年利息收入
begin
—執(zhí)行部分
end;
五、常用數(shù)據(jù)類型
1.標(biāo)量類型:
數(shù)字、字符、布爾值、日期時間
2.屬性類型:
%type、%rowtype
%type 以表中的字段類型作為數(shù)據(jù)類型
v_列名 表名.列名%type
%rowtype用于接收單條記錄,每列類型以行內(nèi)數(shù)據(jù)為準(zhǔn),常用與循環(huán)遍歷時使用
v_表名_record 表名%rowtype;
六、賦值語句
teacher.tname%type 以teacher表中的tname字段類型作為數(shù)據(jù)類型
select tname,sal into v_name,v_sal
吧查詢到的tname和sal分別賦值給變量v_name,v_sal
示例:
declare
v_name teacher.tname%type;
v_sal teacher.sal%type;
begin
select tname,sal into v_name,v_sal from teacher where tno=1004;
dbms_output.putline(v_name || ‘的月工資為:’ || v_sal);
end;
七、控制結(jié)構(gòu)
1.條件控制:if語句、case語句
①if語法:
if<布爾表達式> then
PL/SQL和SQL語句
elsif <布爾表達式> then
其他語句
else
其他語句
end if;
②case語法:
case 條件表達式
when 結(jié)構(gòu)1 then
語句段1
when 結(jié)果2 then
語句段2
else
語句段
end case;
2.循環(huán)控制:loop循環(huán)、while循環(huán)、for循環(huán)
①loop語法:
lopp
要執(zhí)行的語句
exit when<條件語句>
end loop;
②while語法:
while <布爾表達式> loop
要執(zhí)行的語句
end loop;
③for語法:
for 循環(huán)計數(shù)器 in [reverse] 下限上限 loop
要執(zhí)行的語句
end loop;
3.順序控制:null語句、goto語句
八、什么時游標(biāo)
游標(biāo)時系統(tǒng)為用戶開設(shè)的一個數(shù)據(jù)緩沖區(qū),用于存放SQL 語句的執(zhí)行結(jié)果(即臨時結(jié)果集resultset)
每個游標(biāo)區(qū)都有一個名字供用戶可以通過游標(biāo)逐一獲取記錄
九、為什么使用游標(biāo)
由于SQL語句的結(jié)果集為數(shù)據(jù)模型,而程序設(shè)計語言為對象模型
例如JAVA只能接收單個變量或一條記錄,而無法接收結(jié)果集,所以采用變量》記錄》對象的形式轉(zhuǎn)換傳遞
步驟:
執(zhí)行SQL語句》得到結(jié)果集放到游標(biāo)》循環(huán)遍歷游標(biāo)區(qū)》記錄一條條傳給JAVA對象
十、游標(biāo)的分類
游標(biāo)類型分為:靜態(tài)游標(biāo)和動態(tài)游標(biāo)
1.靜態(tài)游標(biāo):
在編譯時知道其select語句的游標(biāo)
2.動態(tài)游標(biāo):
運行的時候動態(tài)決定執(zhí)行何種查詢
十一、游標(biāo)的使用
1.聲明游標(biāo):
語法:CURSOR cursor_name is query_sql;
2.打開游標(biāo):
語法:OPEN cursor_name;
3.提取游標(biāo):
使用fetcm語句實現(xiàn)對游標(biāo)內(nèi)容的讀取
variable_list必須與從游標(biāo)提取的結(jié)果集類型相同
fetcm cursor_name into variable_list;
3.關(guān)閉游標(biāo):
使用close語句關(guān)閉一個游標(biāo),關(guān)閉游標(biāo)后,所有資源都將被釋放
close cursor_name;
十二、游標(biāo)屬性
%found
用于檢測游標(biāo)是否成功,通常在fetcm語句之前使用,當(dāng)游標(biāo)按照查詢出一條記錄時,返回true
%isopen
判斷是否處于打開狀態(tài),試圖打開一個已經(jīng)打開或已經(jīng)關(guān)閉的游標(biāo)麻將會出出現(xiàn)錯誤
%notfound
與%found的作用相反,當(dāng)按照條件無法查詢帶記錄時,返回true
%rowcount
循環(huán)執(zhí)行游標(biāo)讀取數(shù)據(jù)時,返回檢索出的記錄數(shù)據(jù)的行數(shù)
十三、動態(tài)和靜態(tài)SQL
1.什么時靜態(tài)SQL:
需要在編寫PL/SQL程序時就確定的SQL語句
2.什么是動態(tài)SQL:
在PL/SQL程序執(zhí)行時生成的SQL語句
DDL 語句命令和會話控制語句不能在PL/SQL中直接使用,但是可以通過動態(tài)SQL來執(zhí)行
編譯程序?qū)討B(tài)SQL不做處理,而是在程序運行時動態(tài)構(gòu)造語句,對語句進行語法分析并執(zhí)行
十四、動態(tài)SQL實現(xiàn)
方法1:本地動態(tài)SQL
execute immediate 語句執(zhí)行
語法:
execute immediate dynamic_sql_string
[into define_variable_list]
[using bind_argument_list];
dynamic_sql_string 是動態(tài)SQL語句字符串
into 子句用于接收select語句選擇的記錄值
using 子句用于綁定輸入?yún)?shù)變量
通過游標(biāo)實現(xiàn)
語法:
TYPE type_cursor id ref CURSOR
[RETURN return_type];
cursor_name type_cursor;
OPEN cursor_name FOR dynamic_sql_string
[USING bind_argument_list];
dynamic_sql_string 是動態(tài)SQL語句字符串
USING 子句用于綁定輸入?yún)?shù)變量
方法2:DBMS_SQL程序包
通過DBMS_SQL程序包實現(xiàn)步驟
①將要執(zhí)行的SQL語句或一個語句塊放到一個字符串變量中
②打開游標(biāo)
③使用DBMS_SQL包的parse過程來分析該字符串
④使用DBMS_SQL包的bind_variable過程來綁定變量
⑤使用DBMS_SQL包的execute函數(shù)來執(zhí)行語句
⑥關(guān)閉游標(biāo)
十五、什么是PL/SQL異常處理
在運行程序時出現(xiàn)的錯誤叫做異常
發(fā)生異常后,語句將停止執(zhí)行,控制權(quán)轉(zhuǎn)移到PL/SQL塊的異常處理部分
其中,異常分類包括:
①預(yù)定義異常
語法:
BEGIN
sequence_of_statements;
EXCEPTION
WHEN
sequence_of_statements;
WHEN OTHERS THEN
sequence_of_statements;
END;
示例:
BEGIN
update teacher t set t.comm=100/0;
EXCEPTION
WHEN ZERO_DIVIDE THEN dbms_output.put_line(‘除數(shù)為0’);
WHEN OTHERS THEN dbms_output.put_line(‘其他異常’);
END;
用戶定義異常
聲明異常:
BEGIN
RAISE e_exceptionName;
處理異常:
EXCEPTION
WHEN
sequence_of_statements;
WHEN OTHERS THEN
sequence_of_statements;
本文由網(wǎng)上采集發(fā)布,不代表我們立場,轉(zhuǎn)載聯(lián)系作者并注明出處:http://m.zltfw.cn/shbk/37207.html