|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你可以配置MySQL运行在微小的嵌入式应用程序中,处理的数据可能不足1Mb??而你也可以用它来处理数Tb的数据。MySQL获得这种可扩展性的路径之一是通过一个人们所熟知的存储过程,这是一个运行在程序之外的微型、预编译程序。oracle|sql言语OraclePL/SQL言语基本
2002-8-23
OraclePL/SQL言语基本
PL/SQL是ORACLE对尺度数据库言语的扩大,ORACLE公司已将PL/SQL整合到ORACLE服务器和其他工具中了,近几年中更多的开辟职员和DBA入手下手利用PL/SQL,本文将报告PL/SQL基本语法,布局和组件、和怎样计划并实行一个PL/SQL程序。
PL/SQL的长处
从版本6入手下手PL/SQL就被牢靠的整合到ORACLE中了,一旦把握PL/SQL的长处和其独占的数据办理的便当性,那末你很难设想ORACLE缺了PL/SQL的情况。PL/SQL不是一个自力的产物,他是一个整合到ORACLE服务器和ORACLE工具中的手艺,能够把PL/SQL看做ORACLE服务器内的一个引擎,sql语句实行者处置单个的sql语句,PL/SQL引擎处置PL/SQL程序块。当PL/SQL程序块在PL/SQL引擎处置时,ORACLE服务器中的SQL语句实行器处置pl/sql程序块中的SQL语句。
PL/SQL的长处以下:
.PL/SQL是一种高功能的基于事件处置的言语,能运转在任何ORACLE情况中,撑持一切数据处置命令。经由过程利用PL/SQL程序单位处置SQL的数据界说和数据把持元素。
.PL/SQL撑持一切SQL数据范例和一切SQL函数,同时撑持一切ORACLE工具范例
.PL/SQL块能够被定名和存储在ORACLE服务器中,同时也能被其他的PL/SQL程序或SQL命令挪用,任何客户/服务器工具都能会见PL/SQL程序,具有很好的可重用性。
.可使用ORACLE数据工具办理存储在服务器中的PL/SQL程序的平安性。能够受权或打消数据库其他用户会见PL/SQL程序的才能。
.PL/SQL代码可使用任何ASCII文本编纂器编写,以是对任何ORACLE可以运转的操纵体系都长短常便当的
.关于SQL,ORACLE必需在统一工夫处置每条SQL语句,在收集情况下这就意味作每个自力的挪用都必需被oracle服务器处置,这就占用大批的服务器工夫,同时招致收集拥堵。而PL/SQL是以全部语句块发给服务器,这就下降了收集拥堵。
PL/SQL块布局
PL/SQL是一种块布局的言语,构成PL/SQL程序的单位是逻辑块,一个PL/SQL程序包括了一个或多个逻辑块,每一个块都能够分别为三个部分。与其他言语不异,变量在利用之前必需声明,PL/SQL供应了自力的专门用于处置非常的部分,上面形貌了PL/SQL块的分歧部分:
声明部分(Declarationsection)
声明部分包括了变量和常量的数据范例和初始值。这个部分是由关头字DECLARE入手下手,假如不必要声明变量或常量,那末能够疏忽这一部分;必要申明的是游标的声明也在这一部分。
实行部分(Executablesection)
实行部分是PL/SQL块中的指令部分,由关头字BEGIN入手下手,一切的可实行语句都放在这一部分,其他的PL/SQL块也能够放在这一部分。
非常处置部分(Exceptionsection)
这一部分是可选的,在这一部分中处置非常或毛病,对非常处置的具体会商我们在前面举行。
PL/SQL块语法
[DECLARE]
---declarationstatements
BEGIN
---executablestatements
[EXCEPTION]
---exceptionstatements
END
PL/SQL块中的每条语句都必需以分号停止,SQL语句可使多行的,但分号暗示该语句的停止。一行中能够有多条SQL语句,他们之间以分号分开。每个PL/SQL块由BEGIN或DECLARE入手下手,以END停止。正文由--标示。
PL/SQL块的定名和匿名
PL/SQL程序块能够是一个定名的程序块也能够是一个匿名程序块。匿名程序块能够用在服务器端也能够用在客户端。
定名程序块能够呈现在其他PL/SQL程序块的声明部分,这方面对照分明的是子程序,子程序能够在实行部分援用,也能够在非常处置部分援用。
PL/SQL程序块可背自力编译并存储在数据库中,任何与数据库相毗连的使用程序都能够会见这些存储的PL/SQL程序块。ORACLE供应了四品种型的可存储的程序:
.函数
.历程
.包
.触发器
函数
函数是定名了的、存储在数据库中的PL/SQL程序块。函数承受零个或多个输出参数,有一个前往值,前往值的数据范例在创立函数时界说。界说函数的语法以下:
FUNCTIONname[{parameter[,parameter,...])]RETURNdatatypesIS
[localdeclarations]
BEGIN
executestatements
[EXCEPTION
exceptionhandlers]
END[name]
历程
存储历程是一个PL/SQL程序块,承受零个或多个参数作为输出(INPUT)或输入(OUTPUT)、或既作输出又作输入(INOUT),与函数分歧,存储历程没有前往值,存储历程不克不及由SQL语句间接利用,只能经由过程EXECUT命令或PL/SQL程序块外部挪用,界说存储历程的语法以下:
PROCEDUREname[(parameter[,parameter,...])]IS
[localdeclarations]
BEGIN
executestatements
[EXCEPTION
exceptionhandlers]
END[name]
包(package)
包实在就是被组合在一同的相干工具的汇合,当包中任何函数或存储历程被挪用,包就被加载进内存中,包中的任何函数或存储历程的子程序会见速率将年夜年夜加速。
包由两个部分构成:标准和包主体(body),标准形貌变量、常量、游标、和子程序,包体完整界说子程序和游标。
触发器(trigger)
触发器与一个表或数据库事务接洽在一同的,当一个触发器事务产生时,界说在表上的触发器被触发。
变量和常量
变量寄存在内存中以取得值,能被PL/SQL块援用。你能够把变量设想成一个可蕴藏器材的容器,容器内的器材是能够改动的。
声明变量
变量一样平常都在PL/SQL块的声明部分声明,PL/SQL是一种健壮的范例言语,这就是说在援用变量前必需起首声明,要在实行或非常处置部分利用变量,那末变量必需起首在声明部分举行声明。
声明变量的语法以下:
Variable_name[CONSTANT]databyte[NOTNULL][:=|DEFAULTexpression]
注重:能够在声明变量的同时给变量强迫性的加上NOTNULL束缚前提,此时变量在初始化时必需赋值。
给变量赋值
给变量赋值有两种体例:
.间接给变量赋值
X:=200;
Y=Y+(X*20);
.经由过程SQLSELECTINTO或FETCHINTO给变量赋值
SELECTSUM(SALARY),SUM(SALARY*0.1)
INTOTOTAL_SALARY,TATAL_COMMISSION
FROMEMPLOYEE
WHEREDEPT=10;
常量
常量与变量类似,但常量的值在程序外部不克不及改动,常量的值在界说时付与,,他的声明体例与变量类似,但必需包含关头字CONSTANT。常量和变量都可被界说为SQL和用户界说的数据范例。
ZERO_VALUECONSTANTNUMBER:=0;
这个语句定了一个名叫ZERO_VALUE、数据范例是NUMBER、值为0的常量。
标量(scalar)数据范例
标量(scalar)数据范例没有外部组件,他们大抵可分为以下四类:
.number
.character
.date/time
.boolean
表1显现了数字数据范例;表2显现了字符数据范例;表3显现了日期和布尔数据范例。
表1ScalarTypes:Numeric
表2字符数据范例
表3DATE和BOOLEAN
LOB数据范例
LOB(年夜工具,Largeobject)数据范例用于存储相似图象,声响如许的年夜型数据工具,LOB数据工具能够是二进制数据也能够是字符数据,其最年夜长度不凌驾4G。LOB数据范例撑持恣意会见体例,LONG只撑持按次会见体例。LOB存储在一个独自的地位上,同时一个LOB定位符(LOBlocator)存储在原始的表中,该定位符是一个指向实践数据的指针。在PL/SQL中操纵LOB数据工具利用ORACLE供应的包DBMS_LOB.LOB数据范例可分为以下四类:
.BFILE
.BLOB
.CLOB
.NCLOB
操纵符
与其他程序计划言语不异,PL/SQL有一系列操纵符。操纵符分为上面几类:
.算术操纵符
.干系操纵符
.对照操纵符
.逻辑操纵符
算术操纵符如表4所示
干系操纵符次要用于前提判别语句或用于where子串中,干系操纵符反省前提和了局是不是为true或false,表5是PL/SQL中的干系操纵符
表6显现的是对照操纵符
表7.8显现的是逻辑操纵符
[[TheNo.8Picture.]]
实行部分
实行部分包括了一切的语句和表达式,实行部分以关头字BEGIN入手下手,以关头字EXCEPTION停止,假如EXCEPTION不存在,那末将以关头字END停止。分号分开每条语句,利用赋值操纵符:=或SELECTINTO或FETCHINTO给每一个变量赋值,实行部分的毛病将在非常处置部分化决,在实行部分中可使用另外一个PL/SQL程序块,这类程序块被称为嵌套块
一切的SQL数据操纵语句都能够用于实行部分,PL/SQL块不克不及再屏幕上显现SELECT语句的输入。SELECT语句必需包含一个INTO子串大概是游标的一部分,实行部分利用的变量和常量必需起首在声明部分声明,实行部分必需最少包含一条可实行语句,NULL是一条正当的可实行语句,事物把持语句COMMIT和ROLLBACK能够在实行部分利用,数据界说言语(DataDefinitionlanguage)不克不及在实行部分中利用,DDL语句与EXECUTEIMMEDIATE一同利用大概是DBMS_SQL挪用。
实行一个PL/SQL块
SQL*PLUS中匿名的PL/SQL块的实行是在PL/SQL块后输出/来实行,以下面的例子所示:
declare
v_comm_percentconstantnumber:=10;
begin
updateemp
setcomm=sal*v_comm_percent
wheredeptno=10;
end
SQL>/
PL/SQLproceduresuccessfullycompleted.
SQL>
定名的程序与匿名程序的实行分歧,实行定名的程序块必需利用execute关头字:
createorreplaceprocedureupdate_commission
(v_deptinnumber,v_perventinnumberdefault10)is
begin
updateemp
setcomm=sal*v_percent
wheredeptno=v_dept;
end
SQL>/
Procedurecreated
SQL>executeupdate_commission(10,15);
PL/SQLproceduresuccessfullycompleted.
SQL>
假如在另外一个定名程序块或匿名程序块中实行这个程序,那末就不必要EXECUTE关进字。
declare
v_deptnumber;
begin
selecta.deptno
intov_dept
fromempa
wherejob=PRESIDENT
update_commission(v_dept);
end
SQL>/
PL/SQLproceduresuccessfullycompleted
SQL>
把持布局
把持布局把持PL/SQL程序流程的代码行,PL/SQL撑持前提把持和轮回把持布局。
语法和用处
IF..THEN
语法:
IFconditionTHEN
Statements1;
Statements2;
....
ENDIF
IF语句判别前提condition是不是为TRUE,假如是,则实行THEN前面的语句,假如condition为false或NULL则跳过THEN到ENDIF之间的语句,实行ENDIF前面的语句。
IF..THEN...ELSE
语法:
IFconditionTHEN
Statements1;
Statements2;
....
ELSE
Statements1;
Statements2;
....
ENDIF
假如前提condition为TRUE,则实行THEN到ELSE之间的语句,不然实行ELSE到ENDIF之间的语句。
IF能够嵌套,能够在IF或IF..ELSE语句中利用IF或IF..ELSE语句。
if(a>b)and(a>c)then
g:=a;
else
g:=b;
ifc>gthen
g:=c;
endif
endif
IF..THEN..ELSIF
语法:
IFcondition1THEN
statement1;
ELSIFcondition2THEN
statement2;
ELSIFcondition3THEN
statement3;
ELSE
statement4;
ENDIF;
statement5;
假如前提condition1为TRUE则实行statement1,然后实行statement5,不然判别condition2是不是为TRUE,若为TRUE则实行statement2,然后实行statement5,关于condition3也是不异的,假如condition1,condition2,condition3都不建立,那末将实行statement4,然后实行statement5。
轮回把持
轮回把持的基础情势是LOOP语句,LOOP和ENDLOOP之间的语句将无穷次的实行。LOOP语句的语法以下:
LOOP
statements;
ENDLOOP
LOOP和ENDLOOP之间的语句无穷次的实行明显是不可的,那末在利用LOOP语句时必需利用EXIT语句,强迫轮回停止,比方:
X:=100;
LOOP
X:=X+10;
IFX>1000THEN
EXIT;
ENDIF
ENDLOOP;
Y:=X;
此时Y的值是1010.
EXITWHEN语句将停止轮回,假如前提为TRUE,则停止轮回。
X:=100;
LOOP
X:=X+10;
EXITWHENX>1000;
X:=X+10;
ENDLOOP;
Y:=X;
WHILE..LOOP
WHILE..LOOP有一个前提与轮回相接洽,假如前提为TRUE,则实行轮回体内的语句,假如了局为FALSE,则停止轮回。
X:=100;
WHILEX<=1000LOOP
X:=X+10;
ENDLOOP;
Y=X;
FOR...LOOP
语法:
FORcounterIN[REVERSE]start_range....end_rangeLOOP
statements;
ENDLOOP;
LOOP和WHILE轮回的轮回次数都是不断定的,FOR轮回的轮回次数是流动的,counter是一个隐式声明的变量,他的初始值是start_range,第二个值是start_range+1,直到end_range,假如start_range即是end_range,那末轮回将实行一次。假如利用了REVERSE关头字,那末局限将是一个降序。
X:=100;
FORv_counterin1..10loop
x:=x+10;
endloop
y:=x;
假如要加入for轮回可使用EXIT语句。
标签
用户可使用标签使程序取得更好的可读性。程序块或轮回都能够被标志。标签的情势是。
标志程序块
[DECLARE]
.........
BEGIN
........
[EXCEPTION]
.......
ENDlabel_name
标志轮回
LOOP
.........
loop
..........
loop
....
EXITouter_loopWHENv_condition=0;
endloopinnermost_loop;
..........
ENDLOOPinner_loop;
ENDLOOPouter_loop;
GOTO语句
语法:
GOTOLABEL;
实行GOTO语句时,把持会当即转到由标签标志的语句。PL/SQL中对GOTO语句有一些限定,关于块、轮回、IF语句而言,从外层跳转到内层长短法的。
X:=100;
FORV_COUNTERIN1..10LOOP
IFV_COUNTER=4THEN
GOTOend_of_loop
ENDIF
X:=X+10;
NULL
ENDLOOP
Y:=X;
注重:NULL是一个正当的可实行语句。
嵌套
程序块的外部能够有另外一个程序块这类情形称为嵌套。嵌套要注重的是变量,界说在最内部程序块中的变量能够在一切子块中利用,假如在子块中界说了与内部程序块变量不异的变量名,在实行子块时将利用子块中界说的变量。子块中界说的变量不克不及被父块援用。一样GOTO语句不克不及由父块跳转道子块中,反之则是正当的。
《OUTERBLOCK》
DECLARE
A_NUMBERINTEGER;
B_NUMBERINTEGER;
BEGIN
--A_NUMBERandB_NUMBERareavailablehere
DECLARE
C_NUMBERINTEGER
B_NUMBERNUMBER(20)
BEGIN
C_NUMBER:=A_NUMBER;
C_NUMBER=OUTER_BLOCK.B_NUMBER;
ENDSUB_BLOCK;
ENDOUT_BLOCK;
小结
我们在这篇文章中先容了PL/SQL的基本语法和怎样利用PL/SQL言语计划和运转PL/SQL程序块,并将PL/SQL程序整合到Oracle服务器中,固然PL/SQL程序作为功效块嵌进Oracle数据库中,但PL/SQL与ORACLE数据库的严密分离使得愈来愈多的Oracle数据库办理员和开辟职员入手下手利用PL/SQL。
原蓝普IT认证综合站
不可否认,MySQL也是一个很好的关系型数据库,或许在技术上它与其他领先的关系数据库相差并不大,或不具有劣势。但是,对于一些企业环境来说,MySQL显然不具有优势。 |
|