1. PL/SQL块简介
块(Block)是PL/SQL的基本程序单元,编写PL/SQL程序实际上就是编写PL/SQL程序块,要完成相对简单的应用功能,可能只需要编写一个PL/SQL块;而如果要实现复杂的应用功能,那么可以在一个PL/SQL快中嵌套其他PL/SQL块。块的嵌套层次没有限制。
1.1 PL/SQL块结构
PL/SQL块由三个部分组成:定义部分、执行部分、例外处理部分。
- 定义部分用于定义常量、变量、游标、例外、复杂数据类型等。
- 执行部分用于实现应用模块功能,该部分包含了要执行的PL/SQL语句和SQL语句。
- 例外处理部分用于处理执行部分可能出现的错误。
结构如下:
Declare
/*
* 定义部分 -- 定义常量、变量、复杂数据类型、游标、例外。
*/
beging
/*
* 执行部分 -- PL/SQL和SQL语句
*/
exception
/*
* 例外运行部分 -- 处理运行错误
*/
end; /* 块结束标记 */
其中declare(定义)部分和exception(例外)部分是可选的,beging、end执行部分是必须的。
1.2 PL/SQL块分类
PL/SQL块可划分为:匿名块、命名块、子程序和触发器等四种类型。
1.匿名块
匿名块是指没有名称的PL/SQL块,匿名块既可以内嵌到应用程序中,也可以在SQL*PLUS中直接使用。
示例如下:
DECLARE
v_avgsal NUMBER(6,2);
BEGIN
SELECT avg(sal) INTO v_argsal FROM emp WHERE deptno = &no;
dbms_output.put_line('平均工资' || v_avgsal);
END; /* 块结束标记 */
如上所示,该PL/SQL块直接以DECLARE开始,没有给出任何名称,所以该PL/SQL块属于匿名块。
2.命名块
是指具有特定名称标识的PL/SQL块,命名块与匿名块非常相似,只不过在PL/SQL块前使用<<>>来标记,当使用嵌套块时,为了区分多级嵌套层次关系,可以使用命名块加以区分。
示例如下:
<<outer>>
DECLARE
v_deptno NUMBER(2);
v_dname VARCHAR2(10);
BEGIN
<<inner>>
BEGIN
SELECT dname INTO v_dname FROM emp WHERE lower(ename) = lower('&name');
END; --<<inner>>
SELECT deptno INTO v_deptno FROM emp WHERE deptno = v_deptno;
dbms_output.put_line('部门名称' || v_dname);
END; /* outer块结束标记 */
如例所示,<<outer>>和<<inner>>分别是主块(外层块)和子块(内层块)的标记,这种PL/SQL块被称为命名块。
3.子程序
子程序包括过程、函数和包。当开发PL/SQL块时,既可以开发客户端的子程序,也可以开发服务器端的子程序。将业务逻辑集成到PL/SQL子程序中,可以简化客户端程序的开发和维护,并提高应用程序的性能。
[list]
过程
过程用于执行特定的操作,在建立过程时,既可以制定输入参数(IN),也可以指定输出参数(OUT)。通过在过程中指定输入参数,达到将应用程序中的数据传递到执行部分;通过使用输出参数将执行部分的数据传递到应用程程序中。
CREATE PROCEDURE命令就是用来创建过程的。示例如下:
CREATE PROCEDURE update_sal(name VARCHAR2, newsal NUMBER)
IS
BEGIN
UPDATE emp SET sal = newsal WHERE lower(ename) = lower(name);
END;
如示例所示,过程update_sal用于更新雇员工资。当在SQL*PLUS中调用该过程时,可以使用execute命令或者call命令。示例如下:
SQL > exec update_sal('scott', 3000);
SQL > call update_sal('scott', 4000);
函数
函数用于返回特定的数据。当建立函数时,在函数的头部必须包含RETURE子句,而在函数体内必须要包含RETURN语句返回数据。
CREATE FUNCTION命令就是用来创建函数的。示例如下:
CREATE FUNCTION annual_income(name VARCHAR2)
RETURN NUMBER IS
annual_salary NUMBER(7,2);
BEGIN
SELECT sal*12 + nvl(comm, 0) INTO annual_salary FROM emp WHERE lower(ename) = lower(name);
RETURN annual_salary;
END;
如上例所示,函数annual_income用于返回雇员的全年收入(包括工资和奖金)。当调用该函数时,可以使用多种方法。在这里使用SQL*PLUS绑定变量存放输出结果,示例如下:
SQL > VAR income NUMBER
SQL > call annual_income('scott') INTO :income;
SQL > PRINT income
INCOME
-----------
24000
包
包用于逻辑组合相关的过程和函数,它由包规范和包体两部分组成。包规范用于定义公用的常量、变量、过程和函数。
CREATE PACKAGE命令就是用来创建包的。示例如下:
CREATE PACKAGE emp_pkg IS
PROCEDURE update_sal(anme varchar2, newsal NUMBER);
FUNCTION annual_income(anme VARCHAR2) RETURN NUMBER;
END;
包规范只包含了过程和函数的说明,而没有过程和函数的实现代码。包体用于实现包规范中的过程和函数,建立包体可以使用
CREATE PACKAGE BODY命令,示例如下:
CREATE PAKAGE BODY emp_pkg IS
PROCEDURE udapte_sal(name VARCHAR2, newsal NUMBER)
IS
BEGIN
UPDATE emp SET sal=newsal
WHERE lower(ename) = lower(name)
END;
FUNCTION annual_income(name VARCHAR2) RETURN NUMBER
IS
annual_salary NUMBER(7,2);
BEGIN
SELECT sal*12+nvl(comm,0) INTO annual_salary
FROM emp WHERE lower(ename) = lower(name);
RETURN annual_salary;
END;
END;
当调用包的过程和函数时,在过程和函数前必须要有包名作为前缀(包名.子程序名),而如果要访问其他方案的包,还必须要加方案名称作为前缀(方案名.包名.子程序名)。示例如下:
SQL > call emp_pkg.update_sal('scott',1500);
......
SQL > VAR income NUMBER
SQL > call emp_pkg.annual_income('scott') INTO :income;
SQL > PRINT income
INCOME
-----------
18000
触发器
触发器是指隐含执行的存储过程。当定义触发器时,必须要指定触发器事件以及触发器操作,常用的触发器事件包括INSERT,UPDATE和DELETE时语句,而触发器操作是执行一段PL/SQL块。在SQL*PLUS中创建触发器是使用
CREATE TRIGGER命令来完成的。示例如下:
CREATE TRIGGER update_cascade
ALTER UPDATE OF deptno ON dept
FOR EACH ROW
BEGIN
UPDATE emp SET deptno =:new.deptno
WHERE deptno=:old.deptno;
END;
如上例所示,触发器update_cascade用于实现级联更新;如果不建立该触发器,那么更新dept表的deptno列数据时,就会显示错误“ORA-02292:违反完整约束条件(SCOTT.FK_DEPTNO)- 已找到子记录日志”;而在建立该触发器后,当更新deptno时,就会级联更新emp表的deptno列的相关数据。
[/list]
2. 定义并使用变量
编写PL/SQL程序时,若临时存储数值,并需要定义变量和常量;若要在应用程序和子程序之间传递数据,那么必须为子程序指定参数。而在PL/SQL中指定变量、常量、参数时,则必须为他们指定PL/SQL中的类型。在编写PL/SQL程序时,可以使用
标量(Scalar)类型、复合(Composite)类型、参照(Reference)类型和LOB(Large Object)类型等四种类型。
其中在标量(Scalar)类型中,Oracle 10g 时新增了BINARY_DOUBLE和BINARY_FLOAT两个类型。另外在Oracle 9i 时,还增加了一些日期时间类型,包括TIMESTAMP,TIMESTAMP WITH ZONE,TIMESTAMP WITH LOCAL ZONE,INTERVAL DAY TO SECOND,INTERVAL YEAR TO MONTH等。这些数据类型都可以在PL/SQL块中引用。
2.1 标量变量
标量变量是指能存放单个数值的变量。当编写PL/SQL块时,最常用的变量就是标量变量。当定义标量变量时,必须要指定标量数据类型。标量数据类型包括数字类型,字符类型,日期类型和布尔类型。每种类型又包括相应的子类型,例如:NUMBER类型就包括INTEGER,POSITIVE等子类型。
1.常用标量类型
1.1 VARCHAR2(n)
该数据类型用于定义可变长度的字符串,其中n用于指定字符串的最大长度,其最大字节为32767。在使用该数据类型定义变量时,必须要指定长度。需要注意,当PL/SQL块中使用该数据类型操作VARCHAR2表列时,其
数值长度不应该操作4000个字节。
1.2 CHAR(n)
该数据类型用于定义固定长度的字符串,其中n用于指定字符串的最大长度,其最大长度为32767字节。当使用该数据类型时,如果没有指定n,其默认值为1。需要注意的是,在PL/SQL块中使用该数据类型定义变量时,其最大
数值长度不应该超过2000字节。
1.3 NUMBER(p,s)
该数据类型用于定义固定长度的整数和浮点数,其中p代表精度,用于指定数值的总位数;s标识标度,用于指定小数点后的数字位数。例如指定了NUMBER(6,2),那么证书位数最大值应该是4位。
1.4 DATE
该数据类型用于定义日期和时间数据。其数据长度为固定长度。但需要注意,在给日期DATE变量赋值时,数据必须要与日期格式和日期语言匹配。
1.5 TIMESTAMP
该数据类型是
Oracle9i新增的数据类型。它也用于定义日期和时间类型。给TIMESTAMP数据类型赋值的方法与给DATE类型赋值的方法一致。但当现实TIMESTAMP变量数据时,不仅会显示日期,而且还会现实时间和上午下午的标记。
1.6 LONG和LONG RAW
LONG数据类型用于定义变长字符串,类似于VARCHAR2数据类型,但其字符串的最大长度为32760字节;LONG RAW数据类型用于定义变长的二进制数据,其数据的最大长度为32760个字节。
1.7 BOOLEAN
该数据类型用于定义布尔变量,其变量值为TRUE,FALSE和NULL。需要注意的是该数据类型是PL/SQL的数据类型。表列不能采用该数据类型。
1.8 BINARY_INTEGER
该数据类型用于定义整数,其值范围在
-2147483647和2147483647之间,在
Oracle9i之前,当在PL/SQL中定义PL/SQL表时,必须使用该数据类型作为下标的数据类型。需要注意的是该数据类型是PL/SQL的数据类型。表列不能采用该数据类型。
1.9 BINARY_FLOAT和BINARY_DOUBLE
BINARY_FLOAT和BINARY_DOUBLE是
Oracle10g新增的数据类型,分别用于定义单精度的浮点数和双精度的浮点数。这两种数据类型主要用于高速的科学计算,当为BINARY_FLOAT变量赋值时,应该带有后缀f(例如:1.5f);当为BINARY_DOUBLE变量赋值时,应该带有后缀d(例如:3.000095d)。
2.定义标量变量
当编写PL/SQL程序时,如果要引用标量变量,必须首先在定义部分定义标量变量,然后才能在执行部分或例外处理部分中使用这些标量变量。
2.1 语法
在PL/SQL中定义变量和常量的语法如下:
identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr]
- identifier:用于指定变量或常量的名称。
- CONSTANT:用于指定常量;当定义常量时,必须指定它的初始值,并且其数值不能变。
- datatype:用于指定变量或常量的数据类型。
- NOT NULL:用于强制初始化变量(不能为NULL)。当指定NOT NULL时,必须要为变量提供数值。
- := >> 用于指定变量和常量的初始值。
- DEFAULT:用于为变量和常量指定初始值。
- expr:用于指定初始值的PL/SQL表达式;可以是文本值、其他变量、函数等。
2.2 定义标量变量示例
当定义标量变量时,必须要使用标量数据类型。示例如下:
v_ename VARCHAR2(10);
v_sal NUMBER(6,2);
v_balance BINARY_FLOAT; --Oracle10g新的数据类型
c_tax_rate CONTANT NUMBER(3,2):=5.5;
v_hiredate DATE;
v_valid BOOLEAN NOT NULL DEFAULT FALSE;
如例所示:以上语句定义了5个变量和1个常量,并且为v_valid提供了默认值。需要注意的是,当定义变量时,没有指定初始值,那么变量的初始值为NULL;
2.3 使用标量变量
当在定义部分定义了标量变量之后,在执行部分和例外处理部分可以引用这些标量变量。需要注意的是,在PL/SQL块中为变量赋值时,不同与其他的变成语言,必须要在等号前加上冒号(
:=)。下面以输入雇员号显示雇员名称
分享到:
相关推荐
pl/sql基础知识ppt
#### PL/SQL基础知识概览 **标题与描述**:本文档围绕“Oracle 9i PL/SQL程序设计笔记”这一核心主题,深入探讨了PL/SQL语言的基础知识及其在Oracle 9i数据库环境中的应用。 **关键词**:Oracle 9i、PL/SQL #### ...
### PL/SQL编程基础知识 #### 一、PL/SQL简介 PL/SQL(Procedural Language for SQL)是一种过程化语言,它结合了SQL的数据操纵功能和过程化语言的控制结构,使用户能够灵活地控制数据操作流程。作为Oracle数据库...
1. **PL/SQL基础**:手册可能会从基础开始,介绍PL/SQL的基本结构,包括声明变量、常量、游标、记录类型等。还会讲解如何编写存储过程、函数和触发器。 2. **控制流程语句**:这包括条件判断(IF-THEN-ELSIF-ELSE)...
这篇博客主要探讨了PL/SQL的基础知识,包括其语法特性、使用场景以及在数据库管理中的重要性。 首先,PL/SQL是一种过程化语言,它允许用户定义变量、控制流程(如循环、条件语句)、处理异常,并且可以嵌入SQL查询...
1. **PL/SQL基础知识**: - PL/SQL结构:了解块的概念,包括声明部分、执行部分和异常处理部分。 - 数据类型:熟悉PL/SQL内置的数据类型,如NUMBER、VARCHAR2、DATE等。 - 变量和常量:声明和使用变量,以及定义...
通过深入学习Oracle PL/SQL的基础知识,开发者能够创建高效、可靠的数据库应用程序,充分利用Oracle数据库的强大功能。在实际工作中,结合源码和工具,可以进一步提升开发效率和代码质量。通过阅读博客文章(如提供...
综上所述,PL/SQL基础知识点包括了程序的模块化、异常处理、数据操纵以及程序编写的结构化设计。掌握这些基本概念和语法结构对于编写高效可靠的PL/SQL程序至关重要,尤其是在进行复杂数据库操作和程序控制时。
### PL/SQL基础编程知识点详解 #### 一、PL/SQL概述 PL/SQL,全称为Procedural Language for SQL,是Oracle数据库特有的高级程序设计语言。它结合了SQL的数据处理能力和传统编程语言的控制结构,使开发者能够在...
首先,让我们探讨Oracle PL/SQL的基础知识。PL/SQL是Oracle数据库的内置编程语言,由块构成,包括声明部分、执行部分和异常处理部分。块可以是匿名块(即直接在SQL*Plus或其他工具中编写的一次性执行的代码),也...
### Oracle PL/SQL程序设计(第5版)(上下册)知识点概述 ...本书不仅覆盖了PL/SQL的基础知识,还包括了大量的实战经验和高级主题,对于想要深入了解和掌握Oracle数据库的读者来说是非常宝贵的资源。
ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...
在使用PL/SQL Developer进行远程连接时,首先需要了解以下知识点: 1. **Oracle TNS(Transparent Network Substrate)**:TNS是Oracle提供的网络通信组件,它定义了如何在客户端和服务器之间建立连接。你需要知道...
Oracle PL/SQL的基本知识,及编程开发知识。非常全面,适合初学者学习。
1. **基础语法**:PL/SQL是过程化SQL,它包含声明部分、执行部分和异常处理部分。声明部分用于定义变量、常量和游标;执行部分包含了SQL语句和流程控制结构,如循环、条件判断等;异常处理部分则用于捕获和处理运行...
1. PL/SQL 基础知识:PL/SQL 是一种基于 Procedural Language 的 SQL 语言,它可以在 Oracle 数据库中执行。PL/SQL 语言具有变量、控制结构、函数和过程等特点,可以用来编写存储过程、函数和触发器。 2. PL/SQL ...
1. **PL/SQL基础**:涵盖PL/SQL的基本语法,包括变量声明、常量定义、条件语句(IF-THEN-ELSIF-ELSE)、循环结构(WHILE, FOR)、异常处理(BEGIN-EXCEPTION-END)以及子程序(PROCEDURE和FUNCTION)的创建与调用。...
1. **PL/SQL基础**:PL/SQL的基础语法,如变量声明、数据类型、流程控制语句(如IF-THEN-ELSIF,FOR循环,WHILE循环)、异常处理(BEGIN-EXCEPTION-END结构)等。 2. **函数与过程**:如何定义和调用用户自定义的...