仓酷云

标题: MYSQL编程:[转贴]Oracle PL/SQL言语基本 [打印本页]

作者: 老尸    时间: 2015-1-16 22:41
标题: MYSQL编程:[转贴]Oracle PL/SQL言语基本
用户时常会发现其实自己并不是第一个选用MySQL数据库的先驱者。”oracle|sql言语[转贴]OraclePL/SQL言语基本

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

Datatype
Range
Subtypes
description

BINARY_INTEGER
-214748-2147483647
NATURAL
NATURAL
NPOSITIVE
POSITIVEN
SIGNTYPE
用于存储单字节整数。
请求存储长度低于NUMBER值。
用于限定局限的子范例(SUBTYPE):
 NATURAL:用于非正数
 POSITIVE:只用于负数
 NATURALN:只用于非正数和非NULL值
 POSITIVEN:只用于负数,不克不及用于NULL值
 SIGNTYPE:只要值:-1、0或1.

NUMBER
1.0E-130-9.99E125
DEC
DECIMAL
DOUBLE
PRECISION
FLOAT
INTEGERIC
INT
NUMERIC
REAL
SMALLINT
存储数字值,包含整数和浮点数。能够选择精度和刻度体例,语法:
number[([,])]。
缺省的精度是38,scale是0.

PLS_INTEGER
-2147483647-2147483647

与BINARY_INTEGER基础不异,但接纳呆板运算时,PLS_INTEGER供应更好的功能。


  表2字符数据范例

datatype
rang
subtype
description

CHAR
最年夜长度32767字节
CHARACTER
存储定长字符串,假如长度没有断定,缺省是1

LONG
最年夜长度2147483647字节

存储可变长度字符串

RAW
最年夜长度32767字节

用于存储二进制数据和字节字符串,当在两个数据库之间举行传送时,RAW数据不在字符集之间举行转换。

LONGRAW
最年夜长度2147483647

与LONG数据范例类似,一样他也不克不及在字符集之间举行转换。

ROWID
18个字节

与数据库ROWID伪列范例不异,可以存储一个行标示符,能够将行标示符看做数据库中每行的独一键值。

VARCHAR2
最年夜长度32767字节
STRINGVARCHAR
与VARCHAR数据范例类似,存储可变长度的字符串。声明办法与VARCHAR不异


  表3DATE和BOOLEAN

datatype
range
description

BOOLEAN
TRUE/FALSE
存储逻辑值TRUE或FALSE,无参数

DATE
01/01/4712BC
存储流动长的日期和工夫值,日期值中包括工夫


  LOB数据范例

  LOB(年夜工具,Largeobject)数据范例用于存储相似图象,声响如许的年夜型数据工具,LOB数据工具能够是二进制数据也能够是字符数据,其最年夜长度不凌驾4G。LOB数据范例撑持恣意会见体例,LONG只撑持按次会见体例。LOB存储在一个独自的地位上,同时一个"LOB定位符"(LOBlocator)存储在原始的表中,该定位符是一个指向实践数据的指针。在PL/SQL中操纵LOB数据工具利用ORACLE供应的包DBMS_LOB.LOB数据范例可分为以下四类:

  .BFILE
  .BLOB
  .CLOB
  .NCLOB

  操纵符

  与其他程序计划言语不异,PL/SQL有一系列操纵符。操纵符分为上面几类:

  .算术操纵符

  .干系操纵符

  .对照操纵符

  .逻辑操纵符

  算术操纵符如表4所示

operator
operation

+加
-减
/除

*乘
**乘方


  干系操纵符次要用于前提判别语句或用于where子串中,干系操纵符反省前提和了局是不是为true或false,表5是PL/SQL中的干系操纵符

operator
operation

<
小于操纵符

<=
小于或即是操纵符

>
年夜于操纵符

>=
年夜于或即是操纵符

=
即是操纵符

!=
不即是操纵符


不即是操纵符

:=
赋值操纵符


  表6显现的是对照操纵符

operator
operation

ISNULL
假如操纵数为NULL前往TRUE

LIKE
对照字符串值

BETWEEN
考证值是不是在局限以内

IN
考证操纵数在设定的一系列值中


  表7.8显现的是逻辑操纵符

operator
operation

AND
两个前提都必需满意

OR
只需满意两个前提中的一个

NOT
取反


  实行部分

  实行部分包括了一切的语句和表达式,实行部分以关头字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采用DBaaS解决方案,他们也可以使用同大企业一样的技术。在大型组织中,DBaaS可以提供部门级解决MySQL学习教程,而无需IT部门和采购部门的介入,提供更快和更容易的方法来实现小型解决方案。
作者: 金色的骷髅    时间: 2015-1-19 21:18
现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.
作者: 飘飘悠悠    时间: 2015-1-26 11:59
不好!如果出了错;不好调试;不好处理!其实web开发将代码分为3层:web层;业务逻辑层和数据访问层;一般对数据库的操作都在数据访问层来做;这样便于调试和维护!而且将来如果是换了数据库的话;你只需要改数据层的代码;其他层的基本可以不变!要是你在jsp中直接调用sql数据库;那么如果换了数据库呢?岂不都要改?如果报了异常呢?怎么做异常处理?
作者: 仓酷云    时间: 2015-2-4 15:03
XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)
作者: 分手快乐    时间: 2015-2-10 02:09
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
作者: 柔情似水    时间: 2015-2-28 15:17
大家注意一点。如下面的例子:
作者: 冷月葬花魂    时间: 2015-3-10 00:23
另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);
作者: 不帅    时间: 2015-3-17 03:11
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
作者: 乐观    时间: 2015-3-23 18:05
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2