PL/SQL块结构与用途
作用:如果不使用PL/SQL语言,oracle一次只能处理一条SQL语句。每条SQL语句都导致客户(client)向服务器(server)调用,从而在性能上产生很大的开销,尤其是在网络操作中。如果使用PL/SQL,一个块中的语句作为一个组,导致客户向服务器的一次调用,减少网络转输
PL/SQL块结构与用途
一个基本的PL/SQL块由三部分组成:定义部分、可执行部分以及例外处理部分:
定义部分:
定义将在可执行部分中调用的所有变量、常量、游标和用户自定义的例外处理。这部分可以没有。
可执行部分:
包括对数据库中进行操作的SQL语句,以及对块中进行组织、控制的PL/SQL语句。这部分必须存在。
例外处理部分:
对可执行部分中的语句,在执行过程中出错或出现非正常现象时所做的相应处理。这部分可以没有。
由基本的PL/SQL块组成PL/SQL程序,可组成不同的程序形式,它们的用途和适用性各不相同。程序形式大致有以下几种:
1、无名块:也就是没有命名的PL/SQL块,它可以是嵌入某一个应用之中的一个PL/SQL块。
2、存储过程/函数:也就是命名了的PL/SQL块,它可以接收参数,并且可以重复地被调用。
3、包
命名了的PL/SQL模块,由一组相关的过程、函数和标识符组成。
4、数据库触发器:是一个与具体数据库表相关联的存储PL/SQL程序。每当一个SQL操作影响到该数据库表时,系统就自动执行相应的数据库触发器。每个表最多可以有12个触发器。
PL/SQL块的定义部分
变量声明语法:
标识符 [constant] 数据类型 [not null]
[:=默认值或PL/SQL表达式]
注意的几点(书p73):
加上关键字CONSTANT,则表示所定义的标识符为一个常量,必须为它赋初值。
如果定义的标识符不能为空,则必须加关键字NOT NULL,并赋初值。
“:=”为赋值操作符。
PL/SQL提供了SQL没有的附加数据类型。除一般的ORACLE SQL数据类型外,PL/SQL还可以使用这些数据类型对变理进行说明
1、BOOLEAN:可用预定义的常量TRUE、FALSE或NULL对一个布尔变量赋值。
2、binary_integer(二进制整数):数值范围在 -2,147,483,647到2,147,483,647之间。
3、NATURAL(自然数):数值范围在0到2,147,483,647之间。
4、POSITIVE(正整数):数值范围在1到2,147,483,647之间。
5、%TYPE:可说明一个变量的数据类型与某一指定列的数据类型相同。
6、%ROWTYPE: 用这种数据类型可以说明一个复合变量,与某一特定有中的一行相同。
变量声明分标量型变量声明和组合变量(复合变量)声明。标量型变量是指其内部没有成员的变量。
例:
age number(5) not null:=25;
pi constant number(9):=3.1415926;
name char(10) not null:=‘fan’;
today date not null:=sysdate;
sex boolean:=true;
例:声明一个变量Student_name,其类型基于另一个变量teacher_name。
Teacher_name char(10);
Student_name teacher_name%type;
例: 声明一个变量No,使其与表emp中EMPNO的类型一致。
no emp.empno%type;
组合型变量内部包含若干个成员,每个成员由标量型变量或组合型变量组成
定义组合型变量的语法如下:
type <类型名> is record
(<域名1> {<标量型数据类型> | <record类型>}[not null],
<域名2> {<标量型数据类型> | <record类型>}[not null],
…….);
<标识符> <类型名>;
例:定义一个变量,存放一个学生的有关信息。
declare
type student is record /*定义组合型变量类型*/
(id number(4) not null:=0,
name char(10) not null:=' ',
sex boolean not null:=true,
birthday date,
physics number(3),chemistry number(3));
stu student; /*定义组合型变量*/
begin
stu.id:=1;
stu.name:='sheng';
stu.sex:=true;
end;
例:声明一个变量,其结构与表emp的数据结构相一致。
declare
emp_value emp%rowtype;
Begin
select * into empvalue from emp
where empno=7369;
dbms_output.put_line(‘姓名:’||‘ ’||emp_value.ename);
End;
注:在运行些PL/SQL块前,应先运行
Set serveroutput on /*使dbms_output.put_line可以显示在屏幕上*/
可执行部分
可执行部分可以包含变量赋值语句、数据查询、数据操纵和事务控制语句。如select、insert、update、delete、commit、rollback等语句。而不能使用CREATE,ALTER,DROP,GRANT,REVOR等数据定义或数据控制命令。
给标量型变量赋值
teacher_name:=‘liu’;
给record类型变量赋值语法:
<record名.域名>:=<pl/sql表达式>;
例:
stud.name:=‘fan’ student.sex:=true;
%rowtype型变量的赋值与record相同。
例:计算表emp中所有雇员的平均工资。
declare
avg_sal number(7,2);
begin
select avg(sal) into avg_sal from emp;
dbms_output.put_line(‘平均工资为:’||avg_sal);
End;
在运用select语句查询时注意查询的结果只能有一条,如果返回的查询结果多于一条或没有找到任何数据,则会产生异常。
事务控制命令
一、事务的概念
事务是一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。事务通常以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK操作结束,COMMIT即提交,提交事务中所有的操作、事务正常结束。ROLLBACK即撤消已作的所有操作,滚回到事务开始时的状态。
二、事务提交命令
作用:提交自上次提交以后对数据库中数据所作的改动。事务提交以后,这些操作就不能再撤消。
事务提交有3种方式:
1、显式提交:使用commit命令
2、隐式提交:有些命令,如alter、audit、comment、connect、create、disconnect、
drop、exit、grant、noaudit、revoke、rename命令等都隐含有commit操作,而无须指明该操作。
3、自动提交
用户可以使用set命令来设置自动提交环境。经过设置后,sql/plus会自动提出交用户的更新工作。一旦设置了自动提交,用户每次执行insert、update或delete命令,系统就会立即自动进行提交。
命令为:
set auto on
三、事务回退
作用:尚未提交的UPDATE,INSERT,DELETE操作,可以用事务回退命令回退,回退之后数据库将回到上次COMMIT后的状态。
命令: rollback
四、保存点
作用:可以把一个事务划分成若干部分,每一部分之间用一个保存点分隔。
格式:
savepoint 保存点名;
rollback to 保存点名;
PL/SQL流程控制
主要有三种:
条件控制
循环控制
跳转控制
有两种形式:
1、 IF_THEN_ELSE语句
语法格式:
if 条件 then
语句1;
语句2;
…… else
语句n;
语句n+1;
…… end if;
2、IF_THEN_ELSE_IF语句
语法格式:
IF 条件1 THEN
语句1;
语句2;
……Elsif 条件2 THEN
语句3;
语句4;
[ELSIF 条件 n THEN
……]
[ELSE
语句n+1
……]
END IF
1、根据下式计算y值
x+1 x>3
y= X×2 X>=0
X÷3 X<0
PL/SQL实现语句1:
declare
x number(4);
y number(10,2);
begin
x:=&x; /* 实现从键盘输入一个值给X */
if x>=3 then
y:=x+1;
elsif x>=0 then
y:=x*2;
else
y:=x/3;
end if;
dbms_output.put_line(y); /* 输出Y值 */
end;
PL/SQL实现语句2:declare
x number(4);
y number(10,2);
begin
x:=&x;
if x>=3 then
y:=x+1;
else if x>=0 then
y:=x*2;
else
y:=x/3;
end if;
end if;
dbms_output.put_line(y);
end;
注意:条件语句中可以没有else 语句如:
declare
x number(4);
y number(10,2);
begin
x:=&x;
if x>=3 then
y:=x+1;
end if;
dbms_output.put_line(y);
end;
循环控制语句
有四种类型:
FOR循环
直到型循环
当型循环
简单循环
FOR循环
语法格式:
For 计数器 in [reverse] 下界..上界
Loop
语句1;
语句2;
……END LOOP;
注意:
计数器是有于控制循环资数的变量,它不需显式地在变量定义部分进行定义。
系统默认时,计数器从下界往上界递增记数,如果在关键字IN后加上REVERSE则表示计数器从上界到下界递增记数。
计数器变量只能在循环体内部使用,不能在循环体外使用。
例:计算1+2+3+……+100的值
declare
S number(5):=0;
Begin
For I in 1..100
Loop
s:=s+I;
End loop;
Dbms_output.put_line(s);
End;
/
例4.10
从键盘接收一个整数,计算它的阶乘并在屏幕上打印输出。
declare
num number(3);
Fac number;
begin
Num:=&num
fac:=1;
if num>0 then
for i in 1..num loop
fac:=fac*i;
end loop;
end if;
end;
直到型循环
特点:先执行循环体,后判断条件。
语法格式:
Loop
<语句1>
<……>
Exit [when 条件]
<语句 n>
<……>
End loop;
例4.11用直到型循环控制语句求从1-100所有整数的和。
解1: declare
I number(3):=100;
suma number;
begin
suma:=0;
loop
suma:=suma+I;
I:=I-1;
exit when I=0;
end loop;
end;
解2:
declare
I number(3):=1;
suma number;
begin
suma:=0;
loop
suma:=suma+I;
I:=I+1;
exit when I>100;
end loop;
dbms_output.put_line(suma);
end;
当型循环
特点:先判断条件,后执行循环体。
语法格式:
While <条件> loop
<语句1>
<……>
End loop;
例4.12 采用当型循环控制语句求1-100所有整数的和
解:先申明一个全局变量:
variable suma number
再写PL/SQL块:
declare
I number(3):=100;
begin
:suma:=0; /*变量suma前带有“:”表示为全局变量*/
While I>0 loop
:suma:=:suma+I;
I:=I-1;
End loop;
End;
跳转语句
语法格式:
<<标号>>
……Goto 标号
有几项原则:
可以实现同一块中语句之间的跳转
可以从子块跳至父块,但不能从父块跳至子块
不能从IF语句体外跳入IF语句内。
不能从循环体外跳入循环体内。
不能从子程序外部跳入到子程序内
循环语句的嵌套
即一个循环语句中还可以包括其它的循环语句。
例:求100-200间的全部素数。
declare
fag boolean:=true;
begin
for i in 100..200 loop
for j in 2..i-1 loop
if mod(i,j)=0 then
fag:=false;
end if;
end loop;
if fag then
dbms_output.put_line(i);
end if;
fag:=true;
end loop;
end;
PL/SQL允许在一个块中包含子块,下段程序中列出了一个匿名的块,它包含另一个子块,该子块有自己的说明部分。例如:
declare
max_i constant int:=100;
i int:=1;
rec_number int ;
begin
for i in 1..max_i loop
if mod(i,5)=0 then
rec_number:=5;
elsif mod(i,7)=0 then
rec_number:=7;
else
rec_number:=i;
end if;
insert into text_table
(record_number,current_date)
values
(rec_number,sysdate);
declare
max_j constant int :=10;
j int :=1;
begin
for j in 1..max_j loop
rec_number:=rec_number*j;
insert into test_table
(rec_number,current_date)
values
(record_number,sysdate);
end loop;
end;
end loop;
end;
分享到:
相关推荐
根据其特性和用途的不同,PL/SQL块可以分为以下几类: - **无名块或匿名块**:临时构建,只能执行一次,可以调用其他程序但不能被其他程序调用。 - **命名块**:带有一个特定的名字,可以被其他程序调用。 - **子...
标题中的“PL/SQL Developer”是指一款由Allround Automations公司开发的专业Oracle数据库管理与开发工具,主要用于编写、调试和执行PL/SQL代码。这款工具以其用户友好的界面和强大的功能,深受数据库管理员和开发...
- **解释计划**: 显示 SQL 语句或 PL/SQL 块的执行计划。 - **优化**: 分析执行计划,找出潜在的性能瓶颈。 ##### 5.2 自动统计 - **统计信息**: 收集关于表和索引的统计信息。 - **用途**: 用于优化查询计划,提高...
- 用途:执行一系列SQL和PL/SQL语句,常用于执行复杂的业务逻辑。 - **函数**: - 特点:可以有零个或多个参数,并有一个返回值。 - 用途:用于计算并返回一个值,便于在其他程序中复用。 - **调用方式**: - 过程...
PL/SQL是Oracle数据库系统中的一个关键组成部分,它是一种过程化语言,结合了SQL的查询能力与编程语言的控制结构。"如何展开PL/SQL"的主题通常涉及到理解、解析和调试PL/SQL代码,这对于Oracle数据库管理员和开发...
此外,文档详细地介绍了PL/SQL运行时体系结构,解释了PL/SQL子程序的概念。PL/SQL子程序包括过程(Procedure)和函数(Function),它们可以模块化地进行数据库操作。文档中还涉及了参数的使用,区分了IN、OUT和IN...
- **变量类型**:列举并解释PL/SQL支持的不同变量类型及其用途。 - **保存测试脚本**:提供保存测试脚本的方法。 - **跟踪运行时间错误**:介绍如何在程序运行过程中捕捉并分析错误信息。 - **包声明和JAVA会话声明*...
根据提供的文件信息,我们可以归纳出一系列关于PL/SQL的基础知识点,包括其背景、用途以及学习指南等内容。 ### PL/SQL基础知识概述 #### 一、PL/SQL简介 PL/SQL (Procedural Language for SQL) 是一种过程化的...
6. 数据库操作:PL/SQL支持在程序块中直接使用SQL语句与数据库进行交互,如SELECT, INSERT, UPDATE, DELETE等操作。这允许开发者在PL/SQL块中编写复杂的逻辑来处理数据。 7. 错误处理:PL/SQL支持异常处理结构,...
Oracle PL/SQL是一种强大的编程语言,它将关系数据库管理系统的功能与高级编程语言相结合,用于在Oracle数据库环境中创建复杂的业务逻辑和数据处理程序。Oracle2BPL-SQL.rar_oracle_pl/sql这个压缩包文件可能包含了...
### PL/SQL Developer 使用技巧小结 #### 一、PL/SQL Developer 记住登录密码功能 在使用 PL/SQL Developer 进行数据库操作时,频繁地输入用户名和密码可能会带来不便。为了提高工作效率,我们可以设置让 PL/SQL ...
本文将深入探讨PL/SQL Developer 14的关键特性、用途以及如何在数据库管理与开发中应用。 PL/SQL Developer是一款强大的工具,它提供了全面的功能,包括代码编辑、调试、性能分析和数据库对象管理。以下是一些主要...
Oracle Database 11g是Oracle Corporation发布的一个版本的数据库系统,它包含了对数据库管理系统的改进和新特性,其中PL/SQL是Oracle数据库中用于存储过程和函数的一种过程化语言。PL/SQL的培训文档通常涵盖了...
这个“64位的PL/sql客户端”是专门为运行在Windows操作系统上的64位架构设计的版本,确保了与64位系统兼容性和更高的性能。 在Oracle数据库环境中,PL/SQL(Procedural Language/Structured Query Language)是一种...
7. **项目管理**:组织和管理相关的PL/SQL文件和数据库对象,形成完整的项目结构。 安装并配置OracleClient后,开发者可以通过PL/SQL Developer连接到Oracle数据库,利用其丰富的功能进行开发工作。例如,通过PL/...
1. **声明变量和常量**:可以在PL/SQL块中声明各种数据类型(如NUMBER、VARCHAR2等)的变量和常量,以便在代码中存储和处理数据。 2. **流程控制语句**:具备IF-THEN-ELSIF-ELSE、CASE、FOR循环、WHILE循环等结构...
Oracle PL/SQL允许开发人员编写块结构的程序,它由三个部分组成:声明部分、执行部分和异常处理部分。声明部分用于定义变量、常量、游标、类型等;执行部分是PL/SQL程序的核心,用于执行逻辑和数据库操作;异常处理...