第二部分 PL/SQL语法部分
一、 PL/SQL语言简介
(本讲义之所有程序均调式通过)
首先我们看一个简单之例子,下面这个例子是统计从1至100的总和.
declare
i number:=0; /*声明变量井给初值*/
t number:=1;
error_message exception; /*声明一个出错处理*/
begin
for t in 1..100 loop
i:=i+t;
end loop;
if i>=5050 then
raise error_message; /*引发错误处理*/
else
insert into c_nt(c_t) values(i);
end if;
exception
when error_message then
insert into c_nt(c_t) values(0);
end;
² 从上例中可以看出PL/SQL语法的一般规则.
PL/SQL中语句以分号(;)结尾.
开始程序块的PL/SQL语句(如IF…或BEGIN语句)没有分句.
文本值括在单引号(‘
‘)内,而不是(“
“).
过程只允许最后有一个出口..
² PL/SQL程序可以分为三个部分
DECLARE部分用于变量、常量、函数、过程、Cursor.
BEGIN部分包含PL/SQL块中要执行的代码 用于程序处理,其中可以调用函数、过程.
Exception 部分用于出错处理.
下面我们再看一个例子:
declare
i number :=1;
t number :=1;
p number :=1;
/*create table c_ny(c_t number,cou_t number);*/
function aa(xx number)return number is /* define function*/
tt number;
ct number:=1;
j number:=1;
begin
while j<=xx loop
ct:=ct+j;
j:=j+1;
end loop;
return ct;
end aa;
begin
/*create table c_nt(c_t number,cou_t number);*/
commit;
while i<=200 loop
t:=t+i;
i:=i+1;
p:=aa(i); /* calling function*/
insert into c_nt values(t,p);
commit;
end loop;
end;
/
说明:
1.在定义变量可以赋初值,赋初值有两种方法,一为上程序所示,另一种为如下所示:
Declare
I number default 92;
T number default 0;
2.定义常量
Declare
I constant number:=1;
T constant number:=9;
3.定义函数
function function_name(parameter type)return type is
…declare variant
begin
…
…
end function_name;
在上面的例子中我们定义了一个函数aa,在begin模块部分引用了此函数aa().
4.定义过程
procedure procedure_name(parameter IN type) is
…declare variant
begin
…
…
exception
…
…
end procedure_name;
见下例:
declare
/*t_emp c_nt%rowtype;*/
i number:=1;
t number:=1;
procedure te_t(t_t number) is /*定义一个函数*/
begin
insert into c_nt1(t_1) values(t_t);
end te_t;
begin
for i in 1..100 loop
te_t(i);
end loop;
end;
/
5.定义Cursor
declare
/*t_emp c_nt%rowtype;*/
t_emp1 number;
t_emp2 number;
cursor tes_t1
is select * from c_nt;
begin
open tes_t1;
delete from c_nt1;
commit;
loop
fetch tes_t1 into t_emp1,t_emp2;
exit when tes_t1%notfound;
insert into c_nt1 values(t_emp1,t_emp2);a
end loop;
close tes_t1;
commit;
end;
/
我们在open 一个cursor时,可能会存在一种情况,即我们不需要cursor中所有之记录,我们该如何处理:
1.在定义一个cursor时,可以附带参数如下所示
declae
cursor c1(p_emp_id) is
select emp_no,emp_name from dept_no where emp_id = p_emp_id;
demp_pt c1%rowtype;
…
…
begin
open c1(123);
loop
fetch c1(123) into demp_pt
…
2.在将cursor中之记录项转到变量中时进行控制,如下所示:
declare
cursor is
select empt_no,empt_name from dept_no;
p_no number;
p_name number;
begin
loop
fetch c1 into (p_no,p_name);
if condition1 then
…
…
end if
end;
注意:
² 因为PL/SQL不支持I/O,所以程序所有结果都是放在数据档中.
² Delete from accts where status=’bad debt’
If sql%rowcount>10 then
Raise out_of_bounds;
End if;
另:
在声明一个变量时,PL/SQL提供两种变量类型:%TYPE,%ROWTYPE.
1.%TYPE
使用%TYPE时,可以有种用法:
² 一用法见下例:
declare
Balance number(7,2);
Minimum_balance balance%type:=10.00;
在上例中,minimum_balance数据类型为number(7,2)具默认值为10.00.
² 二用法见下例(将数据类型与table中一column datatype相对应起来,如果table中column datatype变更,则在运行时,上数据类型会自动的变换上):
declare
my_dname empc.empto%type;
2.%rowtype
使用%rowtype数据类型用于将table和cursor中一数据行相对起来.
见下例:
² Declare
定義一個%rowtype類型,與my_cursor中記錄行對應.
|
Cursor my_cursor is select sal+nvl(comm,0) salcomm,wages,ename from emp;
My_rec my_cursor%rowtype;
Begin
Open my_cursor;
將my_cursor中之記錄寫到my_rec變量中去.
|
loop
Fetch my_cursor into my_rec ;
Exit when my_cursor%notfound;
If my_rec.wages>200 then
Insert into temp values (null,my_rec.wages,my_rec.ename);
End if;
End loop;
Close my_cursor;
End;
二、 变量说明
在PL/SQL中包括以下几种常见的变量类型:
CHAR-存储定长的ASCII字符串,允许存储数字,文本文符等,最长可255个字符.
VARCHAR2-存储变长的字符串,尽管伋按符串的最大长度来定义,但VARCHAR2和CHAR的区别在于如果达不到定义的长度,下的空间不会自动的填写为空格,VARCHAR2最大可以放入2000个字符.
DATE-实际上是存储时间信息的日期/时间戳,在使用日期时,应考虑怎样使用日期函数.有关日期函数的格式见函数说明部分.
NUMBER-存储数值数据,包括整数和浮点数、数据范围可以从1Ï10 到38Ï10 ,而且,你有很大的数据空间.
BOOLENA-存储布尔值.它表示是/否,真/假,1/0之类的东西.
LONG-这是一种文本字符串,其长度大于VARCHAR2字段的2000个字符.该类最多可储存2 GB个字符,与原始二进制数据相比,它只能存储字符信息.
RAW-用来存储操作系统使用的原始二进制数据,可用于存储像图像或声音记录这样的信息,但这种数据长度最长度只有255字节.
LONG RAW-与LONG类型等价,但存储二进制数据,最长可达2GB个字节.
BINARY_INTEGER-这个字段按计算器使用的二进制格式存储信息,从
-2 到2 -1.
另:
PL/SQL提位两种复合类型:TABLE和RECORD
1.TABLE
² 要定义一个数组,你使用表类型定义语句,例如要定义Last_name数组,可以使用下述语句:
type last_name_list is table of varchar2(22)
index by binary_integer;
last_name last_name_list;
² 当定义一个长类型时,就涉及到一个删除表的问题,PL/SQL表不能用Delete语句来删除,但可以将每一行空值如下所示:
sal_tab(3):=null;
另一种法是定义两个相同类型的表类型,如果要将另一表清空,只需将空表给要清空的表即可.如下所示.
declare
type numtabtype is table of number
index by binary_integer;
sal_tab numbertype;
empty_tab numbertype;
begin
for I in 1..100 loop
sal_tab(I):=I;
end loop;
….
End;
2.RECORD
Declare
Type deptrectype is record
(deptno number(2),
dname char(14),
loc char(14),);
dept_rec deptrectype;
begin
select deptno,dname,loc into dept_rec from dept where deptno=30;
…
…
end;
与所有的编程语言一样,定义一个变量时,同样存在变量作用范围问题:
如下所示:
declare
x real;
function function_name(variant type)return type is
declare
x char;
begin
…
end function_name;
…
…
begin
x:=expression1…
…
end;
如果想引用另一block之变量时,可以加上block label,如下所示:
<<outer>>
declare
birthdate date;
begin
…
declare
birthdate date;
begin
….
If birthdate=outer.birthdate then
….
End if;
End;
End outer;
三、 PL/SQL控制程序流
1. IF
…THEN…ELSIF…ELSE…….END IF
IF … THEN
STATMENT1;
elseif…then…
statment2
elseif…then…
statment3
ELSE
STATMENT4;
end if;
例:
<<outer>>
for ctr in 1..20 loop
…
<<inner>>
for ctr in 1..10 loop
if outer.ctr>ctr then…
…
end loop inner;
end loop outer;
2.loop…exit…end loop
loop
sequence_of_statement;
…
exit;
end loop;
例:
loop
fetch c1 into
…
exit when c1%notfound;
…
end loop;
close c1;
另:加loop label;
例:<<outer>>
loop
…
loop
…
exit outer when…
end loop;
…
end loop outer;
3.while…loop…end loop结构如下所示:
例
while total<=25000 loop
….
Select sa1 into salary from emp where…
Total:=total+salary;
End loop;
4.for…loop…
例1.
select count(empno) into emp_count from emp;
for L in 1..emp_count loop
…
end loop;
例2.
<<outer>>
for step in 1..25 loop
for step in 1..10 loop
…
if outer.step>15 then…
end loop;
end loop outer;
5.cursor….loop
declare
sursor c1 is select ename from emp;
name varchar2(100);
begin
for p_c1_rec in c1 loop
name := p_c1_rec.ename;
end loop;
四、 存储过程
要创建存储过程,可以使用下面的SQL和PL/SQL语句:
CREATE OR REPLACE PROCEDURE PROCEDURE_NAME(parameter list)
AS
…
BEGIN
…
(SQL AND PL/SQL COMMANDS)
END;
五、 存储函数
create or replace function function_name (parameter list) return type is
….
Begin
…
…
end;
六、 Package
Package分为两部分:Specific and Body
在包说明部分中,主要将此包中所含的过程和Function的调用参数说明清楚,如:
CREATE OR REPLACE PACKAGE ZDL_JOB_PKG
AS
PROCEDURE ZDL_INSERT_JOB(
p_bkc_id in number,
p_item_id in number,
p_job_number in out varchar2,
p_group_id in number,
p_lead_day in number,
p_load_type in number,
P_STATUS_TYPE IN NUMBER,
P_USER_ID IN NUMBER,
P_JOB_TYPE IN VARCHAR2);
PROCEDURE ZDL_UPDATE_JOB(
P_BKC_ID IN NUMBER,
P_GROUP_ID IN NUMBER,
P_STATUS_TYPE IN NUMBER,
P_USER_ID IN NUMBER);
FUNCTION WIP_MASS_LOAD(P_GROUP_ID IN NUMBER,P_USER_ID IN NUMBER) RETURN NUMBER;
PROCEDURE ZDL_PRE_UPDATE;
FUNCTION ZDL_UPDATE_ORACLE_WIP(P_USER_ID IN NUMBER) RETURN NUMBER;
FUNCTION ZDL_JOB_STATUS (P_JOB_NUMBER IN VARCHAR2) RETURN NUMBER;
END ZDL_JOB_PKG;
在包体部分,主要将包说明部分之过程及Function之代码写出来,
如:
CREATE OR REPLACE PACKAGE BODY ZDL_JOB_PKG
AS
PROCEDURE ZDL_INSERT_JOB (
p_bkc_id in number, p_item_id in number,p_job_number in out varchar2,
p_group_id in number,
p_lead_day in number,
P_LOAD_TYPE IN NUMBER,
P_STATUS_TYPE IN NUMBER,
P_USER_ID IN NUMBER,
P_JOB_TYPE IN VARCHAR2)
is
…………
begin
…………
end ZDL_INSERT_JOB;
PROCEDURE ZDL_UPDATE_JOB(P_BKC_ID IN NUMBER,P_GROUP_ID IN NUMBER,P_STATUS_TYPE IN NUMBER,P_USER_ID IN NUMBER)
AS
…………
BEGIN
…………
END ZDL_UPDATE_JOB;
FUNCTION WIP_MASS_LOAD(P_GROUP_ID IN NUMBER,P_USER_ID IN NUMBER) RETURN NUMBER
as
…………
begin
…………
END WIP_MASS_LOAD;
PROCEDURE ZDL_PRE_UPDATE IS
…………
begin
…………
end ZDL_PRE_UPDATE;
FUNCTION ZDL_UPDATE_ORACLE_WIP(P_USER_ID IN NUMBER) RETURN NUMBER
IS
…………
begin
…………
end ZDL_UPDATE_ORACLE_WIP;
FUNCTION ZDL_JOB_STATUS (P_JOB_NUMBER IN VARCHAR2) RETURN NUMBER
AS
…………
BEGIN
…………
END ZDL_JOB_STATUS;
END ZDL_JOB_PKG;
七、 触发器
² 所需系统权限
要为某表创建触发器,必须能改变这个表,因此不仅要拥有表,并且要具有这个表的 alter权限,或者具有alter any table系统权限,除此之外,必须有create triger系统权限,若要在另一个用户账号(account)(也称之为模式(schema))上创建触发器,就必具有create any trigger系统权限.
² 所需表权限
触发器可以引用的表并不是初始化触发事件的表.
² 触发器
触发器有十二种类型.一个触发器的类型由执行触发器的层次位置和触发事务的类型定义.
² 行级触发器
在某个事务中,行级触发器行执行,对于上述ledger表中记例子而言,触发器.行级触发器是在create trigger命令中通过用for each row 子句创建的.
² 合法的触发器类型
当两种不同类型之触发动作相结合时,有十二种可能的配置:
Before insert 行级触发器
before insert 语句级触发器
after insert 行级触发器
after insert 语句级触发器
before update 行级触发器
before update 语句级触发器
after update 行级触发器
after update 语句级触发器
before delete 行级触发器
before delete 语句级触发器
after delete 行级触发器
after delete 语句级触发器
例:
CREATE OR REPLACE TRIGGER "APPS"."ZDL_BKC_JOB_BODY_AFI"
AFTER INSERT ON "APPS"."ZDL_BKC_JOB_BODY"
REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW
BEGIN
Insert into audit_tbl values(:new.id,:new……);
UPDATE ZDL_BKC_JOB_HEAD SET UPDATE_DATE = SYSDATE
WHERE ZDL_BKC_JOB_HEAD_ID = :NEW.ZDL_BKC_JOB_BODY_ID;
END;
分享到:
相关推荐
4. **数据库操作**:PL/SQL与Oracle数据库紧密集成,可以执行SQL查询、插入、更新和删除数据。手册会介绍如何在PL/SQL块中使用DML语句,并处理事务管理。 5. **游标**:游标是PL/SQL中处理单行结果集的关键工具。...
综上所述,《PL/SQL开发手册》不仅涵盖了PL/SQL的基本语法和编程技巧,还深入探讨了数据库对象管理、性能优化、测试调试等多个方面,为Oracle初学者提供了一站式的开发指南。无论是希望提升数据库技能的专业人士,...
手册分为两大部分,分别对SQL语法和PL/SQL语法进行了详细讲解。 第一部分,SQL语法部分,主要涉及以下关键语句和概念: 1. **CREATE TABLE** 语句:用于创建数据库中的表,定义了表的结构,包括列名、数据类型、...
PL/SQL,全称Procedural Language/Structured Query Language,是Oracle公司为标准SQL扩展的一种编程语言,它深度融合在Oracle数据库系统中,提供更高级别的数据处理能力。PL/SQL结合了过程化编程的特性,使得数据库...
Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...
本压缩包"PL/SQL语法帮助"是专为初学者设计的指南,包含Sqlhelp.hlp和Plshelp.hlp两个帮助文件,旨在帮助新手快速掌握PL/SQL的基本概念和用法。 首先,让我们深入了解一下PL/SQL的主要组成部分: 1. **声明部分**...
4. **数据操作**:PL/SQL Developer允许直接在界面中查看、插入、更新和删除数据库中的数据,同时支持生成SQL脚本进行批量操作。 5. **数据库连接**:软件支持多种方式连接到Oracle数据库,包括TNS连接、Easy ...
1. **代码编辑器**:提供语法高亮、自动完成和错误检查,使得编写PL/SQL代码更加便捷。 2. **数据库连接**:支持多种Oracle数据库版本的连接,无需复杂的配置步骤,只需输入必要的连接信息。 3. **对象浏览器**:...
本教程将全面解析PL/SQL的语法和应用,是学习者掌握这一技能的宝贵资料。 一、PL/SQL基本结构 PL/SQL由声明部分、执行部分和异常处理部分组成。声明部分包括变量、常量、游标、记录等的定义;执行部分包含SQL语句和...
本文将讲述 PL/SQL 基础语法、结构和组件、以及如何设计并执行一个 PL/SQL 程序。 PL/SQL 的优点包括: * 高性能的基于事务处理的语言,能运行在任何 ORACLE 环境中,支持所有数据处理命令。 * 支持所有 SQL 数据...
1. **基本语法**:PL/SQL由声明部分、执行部分和异常处理部分组成。声明部分用于定义变量、游标、常量等;执行部分包含SQL语句和PL/SQL控制结构,如循环、条件判断等;异常处理部分用于捕获和处理程序运行时可能出现...
PL/SQL Trigger是Oracle数据库中的一个关键特性,用于在特定的数据库事件发生时自动执行一段预定义的PL/SQL代码。这些事件可能包括对表的INSERT、UPDATE或DELETE操作,或者其他的数据库活动。触发器是数据库级别的...
### PL/SQL初学者手册知识点总结 #### 一、PL/SQL简介 PL/SQL (Procedural Language for SQL) 是 Oracle 对标准 SQL 语言的一种过程性扩展。它结合了 SQL 的数据处理能力和传统编程语言的过程控制能力,使得开发者...
3. 源代码编辑器:它提供语法高亮、自动完成、错误检查等功能,使得编写PL/SQL代码更为便捷。同时,还支持代码折叠、模板和自定义键绑定,提高编码效率。 4. 调试器:内置的调试器允许用户设置断点、单步执行、查看...
循环语句是PL/SQL编程中用来重复执行一组语句的结构,包括loop、while、for三种形式,它们各自有不同的使用场景和语法。 分支条件语句在PL/SQL中用来根据不同的条件执行不同的代码分支,主要包括CASE表达式和if-...
以下是一些关键的PL/SQL语法点: 1. **声明变量**:在PL/SQL块的声明部分,你可以声明变量,如`DECLARE var_name datatype;`。例如,`DECLARE num NUMBER;` 2. **数据类型**:PL/SQL支持多种数据类型,包括数值...
1. **PL/SQL编程支持**:PL/SQL Developer内置了强大的PL/SQL编辑器,支持语法高亮、自动完成、错误检查等功能,使开发人员能够高效编写PL/SQL代码。此外,还具备代码折叠、查找替换、书签设置等实用功能,提高了...
根据提供的文件信息,我们可以推断出本书主要关注的是Oracle SQL 和 PL/SQL 的掌握与应用。下面将基于这些信息来生成相关的知识点。 ### Oracle SQL 和 PL/SQL 知识点 #### 一、Oracle SQL 概述 1. **定义**:...