久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

PLSQL教程(數(shù)據(jù)庫(kù)相關(guān))

 hhulxm99 2011-08-30

概述:

PL/SQLORACLE對(duì)標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)語(yǔ)言的擴(kuò)展,ORACLE公司已經(jīng)將PL/SQL整合到ORACLE 服務(wù)器和其他工具中了,,近幾年中更多的開發(fā)人員和DBA開始使用PL/SQL,,本文將講述PL/SQL基礎(chǔ)語(yǔ)法,結(jié)構(gòu)和組件,、以及如何設(shè)計(jì)并執(zhí)行一個(gè)PL/SQL程序,。文中最后感謝FineReport的收集與整理。FineReport---報(bào)表行業(yè)領(lǐng)跑者!

 

 

 

 

 

 

 

 

 

目錄

PL/SQL-------------------------------------------------------------3

優(yōu)點(diǎn)-----------------------------------------------------------3

PL/SQL塊結(jié)構(gòu)-------------------------------------------------- 3

聲明部分-------------------------------------------------------4

執(zhí)行部分-------------------------------------------------------4

異常處理部分---------------------------------------------------4

PL/SQL塊語(yǔ)法---------------------------------------------------4

PL/SQL塊的命名和匿名-------------------------------------------4

函數(shù)-----------------------------------------------------------5

過(guò)程-----------------------------------------------------------5

-------------------------------------------------------------5

觸發(fā)器---------------------------------------------------------5

 

 

變量和常量---------------------------------------------------------6

變量-----------------------------------------------------------6

常量-----------------------------------------------------------7

執(zhí)行部分-------------------------------------------------------10

執(zhí)行一個(gè)PL/SQL----------------------------------------------10

 

 

PL/SQL

  從版本6開始PL/SQL被可靠的整合到ORACLE中了,,一旦掌握PL/SQL的優(yōu)點(diǎn)以及其獨(dú)有的數(shù)據(jù)管理的便利性,,那么你很難想象ORACLE缺了PL/SQL的情形。PL/SQL 不是一個(gè)獨(dú)立的產(chǎn)品,,他是一個(gè)整合到ORACLE服務(wù)器和ORACLE工具中的技術(shù),,可以把PL/SQL看作ORACLE服務(wù)器內(nèi)的一個(gè)引擎,sql語(yǔ)句執(zhí)行者處理單個(gè)的sql語(yǔ)句,,PL/SQL引擎處理PL/SQL程序塊,。當(dāng)PL/SQL程序塊在PL/SQL引擎處理時(shí),ORACLE服務(wù)器中的SQL語(yǔ)句執(zhí)行器處理pl/sql程序塊中的SQL語(yǔ)句,。

  優(yōu)點(diǎn):

  . PL/SQL是一種高性能的基于事務(wù)處理的語(yǔ)言,,能運(yùn)行在任何ORACLE環(huán)境中,支持所有數(shù)據(jù)處理命令,。通過(guò)使用PL/SQL程序單元處理SQL的數(shù)據(jù)定義和數(shù)據(jù)控制元素,。

  . PL/SQL支持所有SQL數(shù)據(jù)類型和所有SQL函數(shù),同時(shí)支持所有ORACLE對(duì)象類型

  . PL/SQL塊可以被命名和存儲(chǔ)在ORACLE服務(wù)器中,,同時(shí)也能被其他的PL/SQL程序SQL命令調(diào)用,,任何客戶/服務(wù)器工具都能訪問(wèn)PL/SQL程序,具有很好的可重用性,。

  . 可以使用ORACLE數(shù)據(jù)工具管理存儲(chǔ)在服務(wù)器中的PL/SQL程序的安全性,。可以授權(quán)或撤銷數(shù)據(jù)庫(kù)其他用戶訪問(wèn)PL/SQL程序的能力,。

  . PL/SQL代碼可以使用任何ASCII文本編輯器編寫,,所以對(duì)任何ORACLE能夠運(yùn)行的操作系統(tǒng)都是非常便利的

  . 對(duì)于SQLORACLE必須在同一時(shí)間處理每一條SQL語(yǔ)句,,在網(wǎng)絡(luò)環(huán)境下這就意味作每一個(gè)獨(dú)立的調(diào)用都必須被oracle服務(wù)器處理,,這就占用大量的服務(wù)器時(shí)間,,同時(shí)導(dǎo)致網(wǎng)絡(luò)擁擠。而PL/SQL是以整個(gè)語(yǔ)句塊發(fā)給服務(wù)器,,這就降低了網(wǎng)絡(luò)擁擠,。

  PL/SQL塊結(jié)構(gòu)

  PL/SQL是一種塊結(jié)構(gòu)的語(yǔ)言,組成PL/SQL程序的單元是邏輯塊,,一個(gè)PL/SQL 程序包含了一個(gè)或多個(gè)邏輯塊,,每個(gè)塊都可以劃分為三個(gè)部分。與其他語(yǔ)言相同,,變量在使用之前必須聲明,,PL/SQL提供了獨(dú)立的專門用于處理異常的部分,下面描述了PL/SQL塊的不同部分:

  

聲明部分(Declaration section)

  聲明部分包含了變量和常量的數(shù)據(jù)類型和初始值,。這個(gè)部分是由關(guān)鍵字DECLARE開始,,如果不需要聲明變量或常量,那么可以忽略這一部分;需要說(shuō)明的是游標(biāo)的聲明也在這一部分,。

  執(zhí)行部分(Executable section)

  執(zhí)行部分是PL/SQL塊中的指令部分,,由關(guān)鍵字BEGIN開始,所有的可執(zhí)行語(yǔ)句都放在這一部分,,其他的PL/SQL塊也可以放在這一部分,。

  異常處理部分(Exception section)

  這一部分是可選的,在這一部分中處理異?;蝈e(cuò)誤,,對(duì)異常處理的詳細(xì)討論我們?cè)诤竺孢M(jìn)行。

  PL/SQL塊語(yǔ)法

[DECLARE]
---declaration statements
BEGIN
---executable statements
[EXCEPTION]
---exception statements
END


  PL/SQL塊中的每一條語(yǔ)句都必須以分號(hào)結(jié)束,,SQL語(yǔ)句可以使多行的,,但分號(hào)表示該語(yǔ)句的結(jié)束。一行中可以有多條SQL語(yǔ)句,,他們之間以分號(hào)分隔,。每一個(gè)PL/SQL塊由BEGINDECLARE開始,以END結(jié)束,。注釋由--標(biāo)示,。

  PL/SQL塊的命名和匿名

  PL/SQL程序塊可以是一個(gè)命名的程序塊也可以是一個(gè)匿名程序塊。匿名程序塊可以用在服務(wù)器端也可以用在客戶端,。

  命名程序塊可以出現(xiàn)在其他PL/SQL程序塊的聲明部分,這方面比較明顯的是子程序,,子程序可以在執(zhí)行部分引用,,也可以在異常處理部分引用。

  PL/SQL程序塊可背獨(dú)立編譯并存儲(chǔ)在數(shù)據(jù)庫(kù)中,,任何與數(shù)據(jù)庫(kù)相連接的應(yīng)用程序都可以訪問(wèn)這些存儲(chǔ)的PL/SQL程序塊,。ORACLE提供了四種類型的可存儲(chǔ)的程序

   . 函數(shù)               . 過(guò)程

.                  . 觸發(fā)器

   
函數(shù)

  函數(shù)是命名了的,、存儲(chǔ)在數(shù)據(jù)庫(kù)中的PL/SQL程序塊。函數(shù)接受零個(gè)或多個(gè)輸入?yún)?shù),,有一個(gè)返回值,,返回值的數(shù)據(jù)類型在創(chuàng)建函數(shù)時(shí)定義。定義函數(shù)的語(yǔ)法如下:

FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name]


  過(guò)程

  存儲(chǔ)過(guò)程是一個(gè)PL/SQL程序塊,,接受零個(gè)或多個(gè)參數(shù)作為輸入(INPUT)或輸出(OUTPUT),、或既作輸入又作輸出(INOUT),與函數(shù)不同,,存儲(chǔ)過(guò)程沒(méi)有返回值,,存儲(chǔ)過(guò)程不能由SQL語(yǔ)句直接使用,只能通過(guò)EXECUT命令或PL/SQL程序塊內(nèi)部調(diào)用,,定義存儲(chǔ)過(guò)程的語(yǔ)法如下:

PROCEDURE name [(parameter[,parameter,...])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]


  (package)

  包其實(shí)就是被組合在一起的相關(guān)對(duì)象的集合,,當(dāng)包中任何函數(shù)或存儲(chǔ)過(guò)程被調(diào)用,包就被加載入內(nèi)存中,,包中的任何函數(shù)或存儲(chǔ)過(guò)程的子程序訪問(wèn)速度將大大加快,。
包由兩個(gè)部分組成:規(guī)范和包主體(body),規(guī)范描述變量、常量,、游標(biāo),、和子程序,包體完全定義子程序和游標(biāo),。

  觸發(fā)器(trigger)

  觸發(fā)器與一個(gè)表或數(shù)據(jù)庫(kù)事件聯(lián)系在一起的,,當(dāng)一個(gè)觸發(fā)器事件發(fā)生時(shí),定義在表上的觸發(fā)器被觸發(fā),。

 

 

變量和常量

  變量存放在內(nèi)存中以獲得值,,能被PL/SQL塊引用。你可以把變量想象成一個(gè)可儲(chǔ)藏東西的容器,,容器內(nèi)的東西是可以改變的,。

  變量

  變量一般都在PL/SQL塊的聲明部分聲明,PL/SQL是一種強(qiáng)壯的類型語(yǔ)言,,這就是說(shuō)在引用變量前必須首先聲明,,要在執(zhí)行或異常處理部分使用變量,那么變量必須首先在聲明部分進(jìn)行聲明,。

  聲明變量的語(yǔ)法如下:

Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]


  注意:可以在聲明變量的同時(shí)給變量強(qiáng)制性的加上NOT NULL約束條件,,此時(shí)變量在初始化時(shí)必須賦值。


  給變量賦值有兩種方式:

  . 直接給變量賦值

   X:=200;
   Y=Y+(X*20);

  . 通過(guò)SQL SELECT INTO FETCH INTO給變量賦值

SELECT SUM(SALARY),SUM(SALARY*0.1)
INTO TOTAL_SALARY,TATAL_COMMISSION
FROM EMPLOYEE
WHERE DEPT=10;

  

常量

  常量與變量相似,,但常量的值在程序內(nèi)部不能改變,,常量的值在定義時(shí)賦予,,,他的聲明方式與變量相似,,但必須包括關(guān)鍵字CONSTANT,。常量和變量都可被定義為SQL和用戶定義的數(shù)據(jù)類型。

ZERO_VALUE CONSTANT NUMBER:=0;


  這個(gè)語(yǔ)句定了一個(gè)名叫ZERO_VALUE,、數(shù)據(jù)類型是NUMBER,、值為0的常量。

  標(biāo)量(scalar)數(shù)據(jù)類型

  標(biāo)量(scalar)數(shù)據(jù)類型沒(méi)有內(nèi)部組件,,他們大致可分為以下四類:

   . number
   . character
   . date/time
   . boolean

  表1顯示了數(shù)字?jǐn)?shù)據(jù)類型;2顯示了字符數(shù)據(jù)類型;3顯示了日期和布爾數(shù)據(jù)類型,。

  表1 Scalar Types:Numeric

Datatype

Range

Subtypes

description

BINARY_INTEGER

-214748-2147483647

NATURAL
NATURAL
NPOSITIVE
POSITIVEN
SIGNTYPE
 

用于存儲(chǔ)單字節(jié)整數(shù)。
要求存儲(chǔ)長(zhǎng)度低于NUMBER值,。
用于限制范圍的子類型(SUBTYPE):
 NATURAL:用于非負(fù)數(shù)
 POSITIVE:只用于正數(shù)
 NATURALN:只用于非負(fù)數(shù)和非NULL
 POSITIVEN:只用于正數(shù),,不能用于NULL
 SIGNTYPE:只有值:-1,、01.

NUMBER

1.0E-130-9.99E125

DEC
DECIMAL
DOUBLE
 
PRECISION
FLOAT
 
INTEGERIC
INT
NUMERIC
REAL
SMALLINT

存儲(chǔ)數(shù)字值,,包括整數(shù)和浮點(diǎn)數(shù),??梢赃x擇精度和刻度方式,,語(yǔ)法:
number[
[,]],。
缺省的精度是38,scale0.

PLS_INTEGER

-2147483647-2147483647

 

BINARY_INTEGER基本相同,,但采用機(jī)器運(yùn)算時(shí),,PLS_INTEGER提供更好的性能 ,。


  表2 字符數(shù)據(jù)類型 

datatype

rang

subtype

description

CHAR

最大長(zhǎng)度32767字節(jié)

CHARACTER

存儲(chǔ)定長(zhǎng)字符串,,如果長(zhǎng)度沒(méi)有確定,缺省是1

LONG

最大長(zhǎng)度2147483647字節(jié)

 

存儲(chǔ)可變長(zhǎng)度字符串

RAW

最大長(zhǎng)度32767字節(jié)

 

用于存儲(chǔ)二進(jìn)制數(shù)據(jù)和字節(jié)字符串,,當(dāng)在兩個(gè)數(shù)據(jù)庫(kù)之間進(jìn)行傳遞時(shí),,RAW數(shù)據(jù)不在字符集之間進(jìn)行轉(zhuǎn)換。

LONGRAW

最大長(zhǎng)度2147483647

 

LONG數(shù)據(jù)類型相似,,同樣他也不能在字符集之間進(jìn)行轉(zhuǎn)換,。

ROWID

18個(gè)字節(jié)

 

與數(shù)據(jù)庫(kù)ROWID偽列類型相同,能夠存儲(chǔ)一個(gè)行標(biāo)示符,,可以將行標(biāo)示符看作數(shù)據(jù)庫(kù)中每一行的唯一鍵值,。

VARCHAR2

最大長(zhǎng)度32767字節(jié)

STRINGVARCHAR

VARCHAR數(shù)據(jù)類型相似,存儲(chǔ)可變長(zhǎng)度的字符串,。聲明方法與VARCHAR相同


  表3 DATEBOOLEAN

datatype

range

description

BOOLEAN

TRUE/FALSE

存儲(chǔ)邏輯值TRUEFALSE,無(wú)參數(shù)

DATE

01/01/4712 BC

存儲(chǔ)固定長(zhǎng)的日期和時(shí)間值,,日期值中包含時(shí)間


  LOB數(shù)據(jù)類型

  LOB(大對(duì)象,Large object) 數(shù)據(jù)類型用于存儲(chǔ)類似圖像,聲音這樣的大型數(shù)據(jù)對(duì)象,,LOB數(shù)據(jù)對(duì)象可以是二進(jìn)制數(shù)據(jù)也可以是字符數(shù)據(jù),,其最大長(zhǎng)度不超過(guò)4GLOB數(shù)據(jù)類型支持任意訪問(wèn)方式,,LONG只支持順序訪問(wèn)方式,。LOB存儲(chǔ)在一個(gè)單獨(dú)的位置上,同時(shí)一個(gè)"LOB定位符"(LOB locator)存儲(chǔ)在原始的表中,,該定位符是一個(gè)指向?qū)嶋H數(shù)據(jù)的指針,。在PL/SQL中操作LOB數(shù)據(jù)對(duì)象使用ORACLE提供的包DBMS_LOB.LOB數(shù)據(jù)類型可分為以下四類:

  . BFILE
  . BLOB
  . CLOB
  . NCLOB

  操作符

  與其他程序設(shè)計(jì)語(yǔ)言相同,PL/SQL有一系列操作符,。操作符分為下面幾類:

  . 算術(shù)操作符                          . 關(guān)系操作符
   
. 比較操作符                          . 邏輯操作符
  
   
算術(shù)操作符如表4所示

operator

operation

+

-

/

*

**

乘方


  關(guān)系操作符主要用于條件判斷語(yǔ)句或用于where子串中,,關(guān)系操作符檢查條件和結(jié)果是否為truefalse,5PL/SQL中的關(guān)系操作符

operator

operation

小于操作符

<=

小于或等于操作符

大于操作符

>=

大于或等于操作符

=

等于操作符

!=

不等于操作符

<> 

不等于操作符

:=

賦值操作符


  表6 顯示的是比較操作符

operator

operation

IS NULL

如果操作數(shù)為NULL返回TRUE

LIKE

比較字符串值

BETWEEN

驗(yàn)證值是否在范圍之內(nèi)

IN

驗(yàn)證操作數(shù)在設(shè)定的一系列值中


  表7.8顯示的是邏輯操作符

operator

operation

AND

兩個(gè)條件都必須滿足

OR

只要滿足兩個(gè)條件中的一個(gè)

NOT

取反


  執(zhí)行部分

  執(zhí)行部分包含了所有的語(yǔ)句和表達(dá)式,執(zhí)行部分以關(guān)鍵字BEGIN開始,以關(guān)鍵字EXCEPTION結(jié)束,,如果EXCEPTION不存在,,那么將以關(guān)鍵字END結(jié)束。分號(hào)分隔每一條語(yǔ)句,,使用賦值操作符:=SELECT INTOFETCH INTO給每個(gè)變量賦值,,執(zhí)行部分的錯(cuò)誤將在異常處理部分解決,在執(zhí)行部分中可以使用另一個(gè)PL/SQL程序塊,,這種程序塊被稱為嵌套塊

  所有的SQL數(shù)據(jù)操作語(yǔ)句都可以用于執(zhí)行部分,,PL/SQL塊不能再屏幕上顯示SELECT語(yǔ)句的輸出。SELECT語(yǔ)句必須包括一個(gè)INTO子串或者是游標(biāo)的一部分,,執(zhí)行部分使用的變量和常量必須首先在聲明部分聲明,,執(zhí)行部分必須至少包括一條可執(zhí)行語(yǔ)句,NULL是一條合法的可執(zhí)行語(yǔ)句,,事物控制語(yǔ)句COMMITROLLBACK可以在執(zhí)行部分使用,,數(shù)據(jù)定義語(yǔ)言(Data Definition language)不能在執(zhí)行部分中使用,DDL語(yǔ)句與EXECUTE IMMEDIATE一起使用或者是DBMS_SQL調(diào)用,。

  執(zhí)行一個(gè)PL/SQL

  SQL*PLUS中匿名的PL/SQL塊的執(zhí)行是在PL/SQL塊后輸入/來(lái)執(zhí)行,,如下面的例子所示:

declare 
 v_comm_percent constant number:=10;
begin
 update emp
 set comm=sal*v_comm_percent
 where deptno=10;
 end
SQL> /
PL/SQL procedure successfully completed.

SQL>


  命名的程序與匿名程序的執(zhí)行不同,執(zhí)行命名的程序塊必須使用execute關(guān)鍵字:

create or replace procedure update_commission
 (v_dept in number,v_pervent in number default 10) is 
begin
 update emp
 set comm=sal*v_percent
 where deptno=v_dept;
end

SQL>/

Procedure created

SQL>execute update_commission(10,15);

PL/SQL procedure successfully completed.

SQL>



  如果在另一個(gè)命名程序塊或匿名程序塊中執(zhí)行這個(gè)程序,,那么就不需要EXECUTE關(guān)進(jìn)字,。

declare
 v_dept number;
begin
 select a.deptno
 into v_dept
 from emp a
 where job='PRESIDENT'
 update_commission(v_dept);
end
SQL>/
 PL/SQL procedure successfully completed
SQL>

 

 

 

文中最后再次感謝FineReport報(bào)表軟件的整理與支持

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多