1.簡(jiǎn)介
Oracle PL/SQL語(yǔ)言(Procedural Language/SQL)是結(jié)合了結(jié)構(gòu)化查詢(xún)與Oracle自身過(guò)程控制為一體的強(qiáng)大語(yǔ)言蒋失,PL/SQL不但支持更多的數(shù)據(jù)類(lèi)型盯桦,擁有自身的變量聲明蚯撩、賦值語(yǔ)句且警,而且還有條件灾锯、循環(huán)等流程控制語(yǔ)句。過(guò)程控制結(jié)構(gòu)與SQL數(shù)據(jù)處理能力無(wú)縫的結(jié)合形成了強(qiáng)大的編程語(yǔ)言,可以創(chuàng)建過(guò)程和函數(shù)以及程序包穴墅。
PL/SQL是一種塊結(jié)構(gòu)的語(yǔ)言霎迫,它將一組語(yǔ)句放在一個(gè)塊中斋枢,一次性發(fā)送給服務(wù)器,PL/SQL引擎分析收到PL/SQL語(yǔ)句塊中的內(nèi)容知给,把其中的過(guò)程控制語(yǔ)句由PL/SQL引擎自身去執(zhí)行瓤帚,把PL/SQL塊中的SQL語(yǔ)句交給服務(wù)器的SQL語(yǔ)句執(zhí)行器執(zhí)行。如圖所示:
2.語(yǔ)法結(jié)構(gòu)
PL/SQL 塊是構(gòu)成 PL/SQL 程序的基本單元
將邏輯上相關(guān)的聲明和語(yǔ)句組合在一起
PL/SQL 分為三個(gè)部分涩赢,聲明部分戈次、可執(zhí)行部分和異常處理部分
[DECLARE
declarations] --聲明部分
BEGIN
executable statements--可執(zhí)行部分
[EXCEPTION
handlers]--異常處理部分
END;
PL/SQL塊可以分為三類(lèi):
1.無(wú)名塊或匿名塊(anonymous):動(dòng)態(tài)構(gòu)造,只能執(zhí)行一次筒扒,可調(diào)用其它程序怯邪,但不能被其它程序調(diào)用。
2.命名塊(named):是帶有名稱(chēng)的匿名塊花墩,這個(gè)名稱(chēng)就是標(biāo)簽悬秉。
3.子程序(subprogram):存儲(chǔ)在數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程澄步、函數(shù)等。當(dāng)在數(shù)據(jù)庫(kù)上建立好后可以在其它程序中調(diào)用它們搂捧。
4.觸發(fā)器(Trigger):當(dāng)數(shù)據(jù)庫(kù)發(fā)生操作時(shí)驮俗,會(huì)觸發(fā)一些事件,從而自動(dòng)執(zhí)行相應(yīng)的程序允跑。
5.程序包(package):存儲(chǔ)在數(shù)據(jù)庫(kù)中的一組子程序王凑、變量定義。在包中的子程序可以被其它程序包或子程序調(diào)用聋丝。但如果聲明的是局部子程序索烹,則只能在定義該局部子程序的塊中調(diào)用該局部子程序。
例如
DECLARE
bid int := '&id'; ①
--v_isbn iweb_tbl_book.isbn%TYPE;②
--v_title iweb_tbl_book.title%TYPE;③
--v_author iweb_tbl_book.author%TYPE;
v_book iweb_tbl_book%ROWTYPE;④
BEGIN
select * into v_book
from iweb_tbl_book
where id = bid;
--輸出結(jié)果
dbms_output.put_line('isbn:' || v_book.isbn);⑤
dbms_output.put_line('title:' || v_book.title);⑥
dbms_output.put_line('author:'|| v_book.author);
dbms_output.put_line('pagenum:'|| v_book.pagenum);
END;
--①'&id'表示從外部錄入數(shù)據(jù)ID弱睦,變量聲明賦值用 :=
也可以使用select…into語(yǔ)句對(duì)變量sname賦值百姓,要求查詢(xún)的結(jié)果必須是一行,不能是多行或者沒(méi)有記錄
SELECT ename INTO sname FROM emp WHERE empno=7934;
--②%iweb_tbl_book.title%TYPE指向表中書(shū)名列的屬性况木,好處是不需要自己再賦予屬性了
--③給變量命名時(shí)一般遵循規(guī)則v_name,給常量命名時(shí)遵循c_name
--④%ROWTYPE - 提供表示表中一行的記錄類(lèi)型
--⑤輸出結(jié)果dbms_output.put_line()
--⑥ || 用來(lái)分隔變量和字符串