PL/SQL程序设计(一)

一、PL/SQL简介:
   使用单一的SQL语句进行数据操作,没有流程控制,无法开发复杂的应用。Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询与Oracle自身过程控制为一体的强大语言,PL/SQL不但支持更多的数据类型,拥有自身的变量声明、赋值语句,而且还有条件、循环等流程控制语句。过程控制结构与SQL数据处理能力无缝的结合形成了强大的编程语言,可以创建过程和函数以及程序包。
   PL/SQL是一种块结构的语言,它将一组语句放在一个块中,一次性发送给服务器,PL/SQL引擎分析收到PL/SQL语句块中的内容,把其中的过程控制语句由PL/SQL引擎自身去执行,把PL/SQL块中的SQL语句交给服务器的SQL语句执行器执行。如图所示:
        
                       
PL/SQL块发送给服务器后,先被编译然后执行,对于有名称的PL/SQL块(如子程序)可以单独编译,永久的存储在数据库中,随时准备执行。PL/SQL的优点还有:
  • 支持SQL
SQL是访问数据库的标准语言,通过SQL命令,用户可以操纵数据库中的数据。PL/SQL支持所有的SQL数据操纵命令、游标控制命令、事务控制命令、SQL函数、运算符和伪列。同时PL/SQL和SQL语言紧密集成,PL/SQL支持所有的SQL数据类型和NULL值。
  • 支持面向对象编程
PL/SQL支持面向对象的编程,在PL/SQL中可以创建类型,可以对类型进行继承,可以在子程序中重载方法等。
  • 更好的性能
SQL是非过程语言,只能一条一条执行,而PL/SQL把一个PL/SQL块统一进行编译后执行,同时还可以把编译好的PL/SQL块存储起来,以备重用,减少了应用程序和服务器之间的通信时间,PL/SQL是快速而高效的。
  • 可移植性
使用PL/SQL编写的应用程序,可以移植到任何操作系统平台上的Oracle服务器,同时还可以编写可移植程序库,在不同环境中重用。
  • 安全性
  可以通过存储过程对客户机和服务器之间的应用程序逻辑进行分隔,这样可以限制对Oracle数据库的访问,数据库还可以授权和撤销其他用户访问的能力。
 
二、PL/SQL块:
   PL/SQL是一种块结构的语言,一个PL/SQL程序包含了一个或者多个逻辑块,逻辑块中可以声明变量,变量在使用之前必须先声明。除了正常的执行程序外,PL/SQL还提供了专门的异常处理部分进行异常处理。每个逻辑块分为三个部分,语法是:
   [DECLARE
     --declaration statements]  ①
     BEGIN
     --executable statements  ②
     [EXCEPTION
     --exception statements]  ③
     END;
语法解析:
          声明部分:声明部分包含了变量和常量的定义。这个部分由关键字DECLARE开始,如果不声明变量或者常量,可以省略这部分。
    执行部分:执行部分是 PL/SQL块的指令部分,由关键字BEGIN开始,关键字END结尾。所有的可执行PL/SQL语句都放在这一部分,该部分执行命令并操作变量。其他的PL/SQL块可以作为子块嵌套在该部分。PL/SQL块的执行部分是必选的。注意END关键字后面用分号结尾。
    异常处理部分:该部分是可选的,该部分用EXCEPTION关键字把可执行部分分成两个小部分,之前的程序是正常运行的程序,一旦出现异常就跳转到异常部分执行。
 
   1、PL/SQL是一种编程语言,与Java一样,除了有自身独有的数据类型、变量声明和赋值以及流程控制语句外,PL/SQL还有自身的语言特性: 
    (1)PL/SQL对大小写不敏感,为了良好的程序风格,开发团队都会选择一个合适的编码标准。比如有的团队规定:关键字全部大些,其余的部分小写。
    (2)PL/SQL块中的每一条语句都必须以分号结束,SQL语句可以是多行的,但分号表示该语句结束。一行中可以有多条SQL语句,他们之间以分号分隔,但是不推荐一行中写多条语句。 
 
   2、PL/SQL中的特殊符号说明:
     
类型
符号
说明
赋值运算符
:=
Java是等号,PL/SQL的赋值是:=
特殊字符
||
字符串连接操作符。
--
PL/SQL中的单行注释。
/*,*/
PL/SQL中的多行注释,多行注释不能嵌套。
<<,>>
标签分隔符。只为了标识程序特殊位置。
..
范围操作符,比如:1..5 标识从1到5
算术运算符
+,-,*,/
基本算术运算符。
**
求幂操作,比如:3**2=9
关系运算符
>,<,>=,<=,=
基本关系运算符,=表示相等关系,不是赋值。
<>,!=
不等关系。
逻辑运算符
AND,OR,NOT
逻辑运算符。
 
  • 变量声明
   PL/SQL支持SQL中的数据类型,PL/SQL中正常支持NUMBER,VARCHAR2,DATE等Oracle SQL数据类型。声明变量必须指明变量的数据类型,也可以声明变量时对变量初始化,变量声明必须在声明部分。声明变量的语法是:
               变量名 数据类型[ :=初始值]
  数据类型如果需要长度,可以用括号指明长度,比如:varchar2(20)。
 
例如:
  SQL> DECLARE
  2  sname VARCHAR2(20) :='abcd';  ①
  3  BEGIN
  4  sname:=sname||' and tom';  ②
  5  dbms_output.put_line(sname);  ③
  6  END;
  7  /
PL/SQL 过程已成功完成
代码解析:
  ①声明一个变量sname,初始化值是“abcd”。字符串用单引号,如果字符串中出现单引号可以使用两个单引号(’’)来表示,即单引号同时也具有转义的作用。
  ②对变量sname重新赋值,赋值运算符是“:=”。
  dbms_output.put_line是输出语句,可以把一个变量的值输出,在SQL*Plus中输出数据时,可能没有结果显示,可以使用命令:set serveroutput on设置输出到SQL*Plus控制台上          
  对变量赋值还可以使用SELECTINTO 语句从数据库中查询数据对变量进行赋值。但是查询的结果只能是一行记录,不能是零行或者多行记录。
 
 例如:
         
 
   代码解析:
   变量初始化时,可以使用DEFAULT关键字对变量进行初始化。
   使用select…into语句对变量sname赋值,要求查询的结果必须是一行,不能是多行或者没有记录。
 
  • 声明常量
  常量在声明时赋予初值,并且在运行时不允许重新赋值。使用CONSTANT关键字声明常量。
 
     
代码解析:
   声明常量时使用关键字CONSTANT,常量初值可以使用赋值运算符(:=)赋值,也可以使用DEFAULT关键字赋值。
 
   在SQL*Plus中还可以声明Session(会话,也就是一个客户端从连接到退出的过程称为当前用户的会话。)全局级变量,该变量在整个会话过程中均起作用,类似的这种变量称为宿主变量。宿主变量在PL/SQL引用时要用“:变量名”引用。
 
                         
代码解析:
   可以使用var声明宿主变量。
   ②PL/SQL中访问宿主变量时要在变量前加“:”。
   ③在SQL*Plus中,使用print可以输出变量中的结果。
 
  三、PL/SQL数据类型:
    PL/SQL的数据类型包括标量数据类型,引用数据类型和存储文本、图像、视频、声音等非结构化的大数据类型(LOB数据类型)等
  • 标量数据类型
     标量数据类型的变量只有一个值,且内部没有分量。标量数据类型包括数字型,字符型,日期型和布尔型。这些类型有的是Oracle SQL中定义的数据类型,有的是PL/SQL自身附加的数据类型。字符型和数字型又有子类型,子类型只与限定的范围有关,比如NUMBER类型可以表示整数,也可以表示小数,而其子类型POSITIVE只表示正整数。
   
类型
说明
VARCHAR2(长度)
可变长度字符串,Oracle SQL定义的数据类型,在PL/SQL中使用时最常32767字节。在PL/SQL中使用没有默认长度,因此必须指定。
NUMBER(精度,小数)
Oracle SQL定义的数据类型。
DATE
Oracle SQL定义的日期类型。
TIMESTAMP
Oracle SQL定义的日期类型。
CHAR(长度)
Oracle SQL定义的日期类型,固定长度字符,最长32767字节,默认长度是1,如果内容不够用空格代替。
LONG
Oracle SQL定义的数据类型,变长字符串基本类型,最长32760字节。在Oracle SQL中最长2147483647字节。
BOOLEAN
PL/SQL附加的数据类型,逻辑值为TRUE、FALSE、NULL
BINARY_INTEGER
PL/SQL附加的数据类型,介于-231和231之间的整数。
PLS_INTEGER
PL/SQL附加的数据类型,介于-231和231之间的整数。类似于BINARY_INTEGER,只是PLS_INTEGER值上的运行速度更快。
NATURAL
PL/SQL附加的数据类型,BINARY_INTEGER子类型,表示从0开始的自然数。
NATURALN
与NATURAL一样,只是要求NATURALN类型变量值不能为NULL。
POSITIVE
PL/SQL附加的数据类型,BINARY_INTEGER子类型,正整数。
POSITIVEN
  • 与POSITIVE一样,只是要求POSITIVE的变量值不能为NULL。
REAL
Oracle SQL定义的数据类型,18位精度的浮点数
INT,INTEGER,SMALLINT
Oracle SQL定义的数据类型,NUMBERDE的子类型,38位精度整数。
SIGNTYPE
PL/SQL附加的数据类型,BINARY_INTEGER子类型。值有:1、-1、0。
STRING
与VARCHAR2相同。
 
  •  属性数据类型
     当声明一个变量的值是数据库中的一行或者是数据库中某列时,可以直接使用属性类型来声明。Oracle中存在两种属性类型:%TYPE和%ROWTYPE。
  
       (1)% ROWTYPE
        引用数据库表中的一行作为数据类型,是PL/SQL附加的数据类型。表示一条记录,就相当于Java中的一个对象。可以使用“.”来访问记录中的属性。
                                      
      代码解析:
     ①声明一个myemp对象,该对象表示student表中的一行。
     ②student表中查询一条记录放入myemp对象中。
      ③访问该对象的属性可以使用“.”。 
   
            (2)%TYPE
       引用某个变量或者数据库的列的类型作为某变量的数据类型。
例如:
SQL> DECLARE
  2       sal student.sage%TYPE;  ①
  3       mysal number(4):=3000;
  4       totalsal mysal%TYPE;  ②
  5  BEGIN
  6       SELECT sage INTO sal FROM student WHERE sno='2018001';
  7       totalsal:=sal+mysal;
  8       dbms_output.put_line(totalsal);
  9  END;
  10  /
     
代码解析:
  定义变量sal为emp表中sal列的类型。
  ②定义totalsal是变量mysal的类型。
 
%TYPE可以引用表中的某列作的类型为变量的数据类型,也可以引用某变量的类型作为新变量的数据类型。
 
 
 

猜你喜欢

转载自www.cnblogs.com/lone5wolf/p/11520480.html