Oracle PL/SQL基礎(chǔ)(PL/SQL程序結(jié)構(gòu), 變量與常量,SQL語(yǔ)句)
1.PL/SQL概述
通過(guò)SQL能夠?qū)?shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行管理。但SQL并不能做程序員希望做的所有事情。SQL有一個(gè)先天缺陷,即對(duì)輸出結(jié)果缺乏過(guò)程控制:它沒有數(shù)組處理、循環(huán)結(jié)構(gòu)和其他編程語(yǔ)言的特點(diǎn)。為了滿足這種要求,Oracle開發(fā)了PL/SQL作為對(duì)SQL的擴(kuò)展,它對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的處理有很好的控制,并且在允許運(yùn)行Oracle的任何操作系統(tǒng)平臺(tái)上均可運(yùn)行PL/SQL程序。
PL/SQL首先出現(xiàn)在1985年的Oracle6中。它主要在Oracle用戶界面SQL*Forms上使用,用于在報(bào)表中引入復(fù)雜的邏輯;它取代了奇特的邏輯控制步進(jìn)方法。它還是一種類似于ADA和C的、相當(dāng)簡(jiǎn)單的結(jié)構(gòu)化編程語(yǔ)言。用戶可以用PL/SQL讀取數(shù)據(jù)、完成邏輯任務(wù)、填充數(shù)據(jù)庫(kù)、創(chuàng)建存儲(chǔ)對(duì)象、在數(shù)據(jù)庫(kù)內(nèi)移動(dòng)數(shù)據(jù)、甚至還可以創(chuàng)建和顯示W(wǎng)eb頁(yè)面。到現(xiàn)在,PL/SQL已完全發(fā)展成為一項(xiàng)成熟的技術(shù), Oracle在很多產(chǎn)品(也就是Oracle應(yīng)用程序)中都使用了PL/SQL, Oracle還將PL/SQL的Web擴(kuò)展廣泛地應(yīng)用在許多其他的應(yīng)用程序和產(chǎn)品中。PL/SQL語(yǔ)言將變量,控制結(jié)構(gòu)、過(guò)程和函數(shù)等結(jié)構(gòu)化程序設(shè)計(jì)的要素引入到SQL語(yǔ)言中,從而可以實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)邏輯。
PL/SQL的執(zhí)行過(guò)程PL/SQL程序的編譯和執(zhí)行是通過(guò)PL/SQL引擎來(lái)完成的。PL/SQL引擎可以安裝在數(shù)層庫(kù)中或者在應(yīng)用開發(fā)工具里,如Oracle Forms通常,Oracle數(shù)據(jù)庫(kù)服務(wù)器端都安裝有PL/SQL引擎。下面以數(shù)據(jù)庫(kù)服務(wù)器端的PL/SQL引擎為例說(shuō)明PL/SQL程序的執(zhí)行過(guò)程,如圖所示:客戶端應(yīng)用程序向Oracle數(shù)據(jù)庫(kù)發(fā)送一個(gè)PL/SQL塊的過(guò)程調(diào)用。服務(wù)器接收到應(yīng)用程序的內(nèi)容后,將其傳遞給PL/SQL引擎,PL/SQL引擎負(fù)責(zé)處理PL/SQL塊中的過(guò)程化語(yǔ)句,而將PL/SQL塊中的SQL語(yǔ)句傳遞給SQL語(yǔ)句執(zhí)行器。

2.PL/SQL程序結(jié)構(gòu)
(1).PL/SQL程序通常包含3個(gè)部分;

(2).嵌套的塊結(jié)構(gòu)
PL/SQL塊中可包含子塊.子塊可位于PL/SQL塊中的任何部分.子塊也可是一條PL/SQL命令.
[Declare ]
--定義語(yǔ)句說(shuō)明部分 (可選的)
Begin
--主塊的語(yǔ)句執(zhí)行部分 (必須的)
Begin
--子塊的語(yǔ)句執(zhí)行部分
[ Exception ]
--子句的異常處理語(yǔ)句段 (可選的)
End;
[ Exception ]
--主塊的異常處理語(yǔ)句段 (可選的)
End ;
(3).PL/SQL塊的類型
無(wú)名塊:沒有命名的PL/SQL塊,嵌入在一個(gè)應(yīng)用內(nèi)的或者交互式發(fā)出的無(wú)名PL/SQL塊.無(wú)名塊可用于服務(wù)器和客戶端.無(wú)名塊在所有的PL/SQL環(huán)境中都使用。動(dòng)態(tài)生成,只能執(zhí)行一次的塊,不能由其他應(yīng)用程序調(diào)用
有名塊(應(yīng)用的過(guò)程和函數(shù)):包括函數(shù)、存儲(chǔ)過(guò)程、包、觸發(fā)器 ,可以多次執(zhí)行的PL/SQL程序,編譯后放在服務(wù)器中,由應(yīng)用程序或系統(tǒng)在特定條件下調(diào)用執(zhí)行。
3.詞法單元
(1).oracle中 =: 和 := 區(qū)別
=:應(yīng)該相當(dāng)于 a = :b 表明b是個(gè)綁定變量,需要執(zhí)行時(shí)進(jìn)行變量綁定
:= 相當(dāng)于一般編程語(yǔ)言中的 賦值 a := 1 即將 數(shù)字1賦值給變量 a
(2).注釋
注釋PL/SQL程序中可以采用兩種注釋形式:單行注釋和多行注釋。
單行注釋:在某一行中以“--”開始,直到該行行尾結(jié)束,可以出現(xiàn)在一行的任何地方。
多行注釋:以“/*”開始,以“*/”結(jié)束,中間可以跨越多行。
(3).運(yùn)算符與表達(dá)式
PL/SQL中需要進(jìn)行運(yùn)算來(lái)對(duì)數(shù)據(jù)進(jìn)行加工處理,要進(jìn)行運(yùn)算就需要有運(yùn)算符。
PL/SQL中允許使用的運(yùn)算符有算術(shù)運(yùn)算符關(guān)系運(yùn)算符、邏輯運(yùn)算符和其他運(yùn)算符,。
PL/SQL中的特殊運(yùn)算符:(與其他程序語(yǔ)言有異的)
不等于操作符: ◇或!=或^=
乘冪運(yùn)算符:**
邏輯運(yùn)算符: AND邏輯與 OR邏輯或 NOT邏輯非
賦值運(yùn)算符:= IS NULL判斷值是否為空 LIKE比較字符串值 IN 驗(yàn)證操作數(shù)在設(shè)定的一系列值中 BETWEEN 驗(yàn)證值是否在范圍之內(nèi)
其中,算術(shù)運(yùn)算符的優(yōu)先級(jí)為(由高到低:乘冪→正負(fù)→乘除→加減;關(guān)系運(yùn)算符的優(yōu)先級(jí)相等;邏輯運(yùn)算符的優(yōu)先級(jí)為(由高到低):not→and→or
由各種運(yùn)算符和括號(hào)將運(yùn)算對(duì)象連接起來(lái)符合PL/SQL語(yǔ)法規(guī)則的式子稱為PL/SQL表達(dá)式。其中,運(yùn)算對(duì)象可以包括常量、變量等。表達(dá)式中運(yùn)算符的優(yōu)先級(jí)決定了表達(dá)式
4. 變量與常量
(1).標(biāo)識(shí)符的定義規(guī)則:
變量必須以字母開頭,后跟字母、數(shù)字、下劃線、$、#等;
變量名長(zhǎng)度不能超過(guò)30個(gè)字符;
標(biāo)識(shí)符中不能包含加號(hào)、減號(hào)和空格;
標(biāo)識(shí)符不能是 SQL的關(guān)鍵字;
標(biāo)識(shí)符不區(qū)分大小寫
注意:如果包含關(guān)鍵字或者空格等特殊字符,需要使用“”括起來(lái),稱為引證標(biāo)識(shí)符。
(2).基本數(shù)據(jù)類型
|
類型 |
說(shuō)明 |
|
varchar2(長(zhǎng)度) |
字符型 用來(lái)存放變長(zhǎng)的字符串,最大長(zhǎng)度4000字節(jié)。在PL/SQL中使用沒有默認(rèn)的長(zhǎng)度,因此必須指定 |
|
Number(精度,小數(shù)) |
數(shù)值型 用來(lái)存放整數(shù)和實(shí)數(shù),可定義精度和取值范圍 |
|
date |
日期型,Oracle常用的日期型變量,date的最小單位是秒 |
|
Char(長(zhǎng)度) |
Oracle SQL用來(lái)存放固定長(zhǎng)度的字符串,最大長(zhǎng)度4000字節(jié),默認(rèn)長(zhǎng)度為1,如果內(nèi)容不夠用空格替代。 |
|
TIMESTAMP |
它包括了所有DATE數(shù)據(jù)類型的年月日時(shí)分秒的信息,而且包括了小數(shù)秒的信息。 |
(3).聲明變量
DECLARE 變量名 數(shù)據(jù)類型[(長(zhǎng)度)][:=初值][default 默認(rèn)值];
(1)PL/SQL變量可以與數(shù)據(jù)庫(kù)列具有同樣的類型:
DECLARE v_StudentName VARCHAR2(20):=‘zhanghe’; v_NumberCredits NUMBER(3):=123; out_num number default 5;
(2)PL/SQL變量也可以是其他類型:
DECLARE v_LoopCounter BINARY_INTEGER; v_CurrentlyRegistered BOOLEAN;
(4).PL/SQL中的常量分為三種
數(shù)值常量;包括整數(shù)、實(shí)數(shù)和指數(shù)。
字符常量:?jiǎn)我?hào)括起來(lái)的字符序列。
布爾常量:其常量有3個(gè)值,TRUE、FALSE和NULL。
日期型常量:表示日期值。
(5).常量的定義方式
常量名 CONSTANT 類型:=常量值;
如:
PI CONSTANT number(5,6):=3.141926;
5.PL/SQL塊中的SQL語(yǔ)句
由于PL/SQL執(zhí)行采用早期綁定,即在編譯階段對(duì)變量進(jìn)行綁定,識(shí)別程序中標(biāo)識(shí)符的位在置,檢查用戶權(quán)限、數(shù)據(jù)庫(kù)對(duì)象等信息,因此在PL/SQL中只允許出現(xiàn)查詢語(yǔ)句(SELECT)、利DML語(yǔ)句(INSERT,UPDATE,DELETE)和事務(wù)控制語(yǔ)句(COMMIT,ROLLBACK,SAVEPOINT),因?yàn)樗鼈儾粫?huì)修改數(shù)據(jù)庫(kù)模式對(duì)象及其權(quán)限.
例:查詢ORDERDETAILS表中產(chǎn)品編號(hào)為1的產(chǎn)品的銷售總價(jià)值和總數(shù)量.
SET SERVEROUTPUT ON--用于展現(xiàn)查詢結(jié)果 DECLARE total_price number(38,3); total_quantity number; BEGIN SELECT sum(unitprice*quantity), sum(quantity) INTO total_price, total_quantity FROM orderdetails WHERE productid=1; Dbms_output.put_line(‘產(chǎn)品1的銷售總價(jià)值為’ || total_price||’,總數(shù)量為’|| total_quantity); END;

浙公網(wǎng)安備 33010602011771號(hào)