首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Oracle 19C入门到精通之PL/SQL简介

PL/SQL(procedural language/SQL)是Oracle在数据库中引入的一种过程化编程语言。PL/SQL构建于SQL之上,可以用来编写包含SQL语句的程序。

PL/SQL是一种过程化语言,在PL/SQL中可以通过IF语句或LOOP语句控制程序的执行流程,甚至可以定义变量,在语句之间传递数据信息,从而操控程序处理的细节过程,以实现比较复杂的业务逻辑。

PL/SQL是Oracle的专用语言,是对标准SQL语言的扩展,它允许在其内部嵌套普通的SQL语句,因此能将SQL语句的数据操纵能力、数据查询能力和PL/SQL的过程处理能力结合在一起,达到取长补短的目的。

1. PL/SQL块结构

PL/SQL程序以块(block)为基本单位,整个PL/SQL块分为3部分,即声明部分(用DECLARE开头)、执行部分(以BEGIN开头)和异常处理部分(以EXCEPTION开头)。其中,执行部分是必需的,其他两个部分可选。

标准PL/SQL块的语法格式如下:

[DECLARE]

--声明部分,可选

BEGIN

--执行部分,必需

[EXCEPTION]

--异常处理部分,可选

END

声明部分由关键字DECLARE开始到BEGIN关键字结束。在这里可以声明PL/SQL程序块中用到的变量、常量和游标等。注意,在某个PL/SQL块中声明的内容只能在当前块中使用,而在其他PL/SQL块中是无法被引用的。

执行部分以关键字BEGIN开始,它的结束方式通常有两种:如果PL/SQL块中的代码在运行时出现异常,则执行完异常处理部分的代码就结束;如果没有使用异常处理或PL/SQL块未出现异常,则以关键字END结束。执行部分是整个PL/SQL块的主体,主要的逻辑控制和运算都在这部分被完成,所以在执行部分可以包含多个PL/SQL语句和SQL语句。

异常处理部分以关键字EXCEPTION开始,在该关键字所包含的代码被执行完毕后,整个PL/SQL块也将结束。在执行PL/SQL代码(主要是执行部分)的过程中,可能会产生一些意想不到的错误,如除数为零、空值参与运算等,这些错误都会导致程序被中断运行,可以在异常处理部分通过编写一定量的代码来纠正错误或者给用户提供一些错误信息提示,甚至是将各种数据操作回退到异常产生之前的状态,以备重新运行代码块。另外,对于可能出现的多种异常情况,可以使用WHEN THEN语句来实现多分支判断,然后在每个分支下通过编写代码来处理相应的异常。

对于PL/SQL块中的语句,每一条PL/SQL语句都必须以分号结束,而每条PL/SQL语句均可以被写成多行的形式,同样必须使用分号来结束;另外,一行中也可以有多条PL/SQL语句,但是它们之间必须以分号分隔。接下来通过一个简单的例子来看PL/SQL块的完整应用。

定义一个PL/SQL块,计算两个整数的和与这两个整数的差的商,代码如下(SQL * Plus中运行代码):

--实现在服务端显示执行结果

set serveroutput on

--PL/SQL块

declare

a int:=100;

b int:=200

c number;

begin

c:=(a+b)/(a-b);

dbms_output.put_line(c);

exception

when zero_divide then

dbms_output.put_line('除数不允许为零!');

end;

/

declaer关键字声明两个整型(int)变量a和b的初始值分别为100和200,声明变量c为数值型(number);在PL/SQL块的执行部分计算出这两个整数的和与它们之间差的商,并调用“dbms_output.put_line(c); ”语句输出计算结果。为了防止除数为零的情况发生,代码块中还设置了异常处理部分,一旦发生除数为零的情况,代码块就会通过调用“dbms_output.put_line('除数不允许为零!');”语句向用户输出提示信息。

2. 代码注释和标识符

注释用于对程序代码进行解释说明,它能够增强程序的可读性,使程序更易于理解。注释编译时会被PL/SQL编译器忽略掉,注释有单行注释多行注释两种情况。

2.1. 单行注释

单行注释由两个连接字符“--”开始,后面紧跟着注释内容。

set serveroutpu on --在服务器端输出结果

declare

Num_sal number; --声明一个数值变量

Var_ename varchar2(20); --声明一个字符串变量

begin

select ename,sal into Var_ename,Num_sal from emp --检索指定的值并存储到变量中

where empno=7369;

dbms_output.put_line(Var_ename||'的工资是'||Num_sal); --输出变量中值

end;

/

注意:如果注释超过一行,就必须在每一行的开头使用连接字符(--)。

2.2. 多行注释

多行注释由“/*”开头,以“*/”结尾,这种多行注释的方法在大多数的编程语言中是相同的。

set serveroutpu on /*在服务器端输出结果*/

declare

Num_sal number; /*声明一个数值变量*/

Var_ename varchar2(20); /*声明一个字符串变量*/

begin

/*检索指定的值并存储到变量中*/

select ename,sal into Var_ename,Num_sal from emp

where empno=7369;

/*输出变量中值*/

dbms_output.put_line(Var_ename||'的工资是'||Num_sal);

end;

2.3. 标识符

标识符(identifier)用于定义PL/SQL块和程序单元的名称;通过使用标识符,可以定义常量、变量、异常、显式游标、游标变量、参数、子程序以及包的名称。当使用标识符定义PL/SQL块或程序单元时,需要满足以下规则:

当定义变量、常量时,每行只能定义一个变量或者常量(行终止符为“;”)

当定义变量、常量时,名称必须以英文字符(A~Z、a~z)开始,并且最大长度为30个字符。如果以其他字符开始,那么必须使用双引号引住。

当定义变量、常量时,名称只能使用字符A~Z、a~z、0~9以及符号_、$和#。如果使用其他字符,那么必须用双引号引住。

当定义变量、常量时,名称不能使用Oracle关键字。例如,不能使用SELECT、UPDATE等作为变量名。如果要使用Oracle关键字定义变量、常量,那么必须使用双引号引住。

所有的PL/SQL程序元素(如关键字、变量名、常量名等)都是由一些字符序列组合而成的,而这些字符序列中的字符都必须取自PL/SQL所允许使用的字符集,这些合法的字符集主要包括以下内容:

大写和小写字母:A~Z或a~z。

数字:0~9。

非显示的字符:制表符、空格和按Enter键。

数学符号:+、-、*、/、>、

间隔符:()、{}、[]、?、!、;、:、@、#、%、$、&等。

除了由引号引起来的字符串,PL/SQL不区分字母的大小写。标准PL/SQL字符集是ASCII字符集的一部分,ASCII是一个单字节字符集,这就是说每个字符可以表示为一个字节的数据,该性质将字符总数限制在最多为256个。

2.4. 分界符

分界符(delimiter)是对PL/SQL有特殊意义的符号(单字符或者字符序列),它们用来将标识符相互分割开。下表列出了在PL/SQL中可以使用的分界符及其意义;

2.5. 文本

文本是指实际数值的文字,包括数字文本、字符文本、布尔文本、日期时间文本、字符串文本等。

数字文本:整数或者浮点数。编写PL/SQL代码时,可以使用科学记数法和幂操作符(**)表示,如100、2.45、3e3、5E6、6*\10**3等。科学记数法和幂操作符只适用于PL/SQL语句,而不适用于SQL语句。

字符文本:用单引号引住的单个字符。这些字符可以是PL/SQL支持的所有可打印字符,包括英文字符(A~Z、a~z)、数字字符(0~9)及其他字符(等),如'A'、'9'、'

布尔文本:通常指BOLLEAN值(TRUE、FALSE和NULL),主要用在条件表达式中。

日期时间文本:指日期时间值。日期文本必须用单引号引住,并且日期值必须与日期格式和日期语言匹配,如'10-NOV-91'、'1997-10-2213:01:01' 、'09-10-月-03'等。

字符串文本:由两个或两个以上字符组成的多个字符值。字符串文本必须用单引号引住,如'Hello World'、'$9600'、'10-NOV-91'等。

在Oracle Database 10g之前,如果字符串文本包含单引号,必须使用两个单引号表示。例如,要为某个变量赋值“I’m a string,you’re a string.”,字符串文本必须要采用以下格式。

string_var:= 'I''m a string,you''re a string.';

在Oracle Database 10g之后,如果字符串文本中包含单引号,既可以使用原有格式赋值,也可以使用其他分隔符([]、{}、等)赋值。

注意使用分隔符[]、{}、为字符串赋值时,不仅需要在分隔符前后加单引号,而且需要带有前缀q。例如:

string_var:= q'[I'm a string,you're a string.]';

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OwpRhSXqsu79eLsEgF03ZG4w0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券