05 PLSQL程序设计 - 2-过程函数

合集下载

ORACLE_PLSQL程序设计

ORACLE_PLSQL程序设计

ORACLE_PLSQL程序设计Oracle PL/SQL是一种强大的编程语言,用于开发Oracle数据库的存储过程、触发器、函数和包。

本篇文章将探讨Oracle PL/SQL程序设计的基本概念、语法和功能,以及一些最佳实践和编程技巧。

PL/SQL是Oracle数据库的内置编程语言,它结合了SQL语句和面向过程的语言特性,可以实现复杂的业务逻辑和数据处理。

PL/SQL程序是在数据库服务器上执行的,它可以访问和操作数据库中的数据,并返回结果。

PL/SQL程序由块组成,一个块是一组PL/SQL语句的逻辑单元。

块由关键字BEGIN和END包围,可以包含变量声明、控制结构、异常处理和SQL语句等。

PL/SQL变量是用来存储和操作数据的命名对象,它可以是标量类型(如整数、字符、日期等)、集合类型(如数组、表)或记录类型。

变量可以在块内部声明,并且可以被块内的其他语句引用。

PL/SQL控制结构用于根据条件执行特定的代码块。

常见的控制结构有IF-THEN、IF-THEN-ELSE、CASE等。

这些控制结构可以根据条件执行不同的代码块,增强了程序的灵活性和可读性。

异常处理是PL/SQL程序设计的重要部分。

当出现意外情况或错误时,异常处理机制可以捕获异常并采取相应的措施。

PL/SQL提供了TRY-CATCH结构来处理异常,可以在CATCH块中编写相应的异常处理代码。

PL/SQL还支持存储过程、触发器和函数等数据库对象的定义和使用。

存储过程是一种一次性地执行一系列操作的程序,触发器是在数据库中发生特定事件时自动执行的程序,函数是返回一个值的程序。

这些数据库对象可以帮助我们实现复杂的业务逻辑和数据操作。

在PL/SQL程序设计中,有一些最佳实践和编程技巧值得注意。

首先,要注意代码的可读性和可维护性,良好的命名约定、适当的缩进和注释可以提高代码的可读性。

其次,需要注意异常处理,正确处理和记录异常可以提高程序的稳定性和可靠性。

第2讲 PLSQL程序设计

第2讲 PLSQL程序设计
37
15.3 控制结构 选择结构 循环结构 跳转结构
38
15.3.1选择结构
IF语句
IF condition1 THEN statements1; [ELSIF condition2 THEN statements2;] …… [ELSE else_statements]; END IF; 注意 条件是一个布尔型变量或表达式,取值只能
数字类型 字符类型 日期/区间类型 行标识类型 布尔类型 原始类型 LOB类型 记录类型 集合类型
20
PL/SQL中常用的基本数据类型
分类
数字类型
字符类型
日期/区间类型 行标识类型
数据类型
NUMBER、BINARY_NUMBER PLS_NUMBER VARCHAR2、CHAR、LONG、
字符串比较
填充比较:通过在短字符串后添加空格,使两个字符串达到相 同长度,然后根据每个字符的ASCII码进行比较。
非填充比较:根据每个字符的ASCII码进行比较,最先结束的 字符串为小。
PL/SQL中规定,对定长的字符串(CHAR类型的字 符串和字符串常量)采用填充比较;如果比较的字符 串中有一个是变长字符串(VARCHAR2类型的字符 串),则采用非填充比较。
如果PL/SQL块相互嵌套,则在内部块中声明的变 量是局部的,只能在内部块中引用,而在外部块 中声明的变量是全局的,既可以在外部块中引用, 也可以在内部块中引用。
如果内部块与外部块中定义了同名变量,则在内 部块中引用外部块的全局变量时需要使用外部块 名进行标识。
27
<<OUTER>> DECLARE v_ename CHAR(15); v_outer NUMBER(5); BEGIN v_outer :=10; DECLARE v_ename CHAR(20); v_inner DATE; BEGIN v_inner:=sysdate; v_ename:='INNER V_ENAME'; OUTER.v_ename:='OUTER V_ENAME'; END; DBMS_OUTPUT.PUT_LINE(v_ename); END;

PL-SQL程序设计PPT2

PL-SQL程序设计PPT2

例子——为新雇员存储其所有信息。
CREATE OR REPLACE PROCEDURE hire_emp (v_emp_no IN emp.empno%TYPE, v_emp_name IN emp.ename%TYPE, v_emp_job IN emp.job%TYPE, v_mgr_no IN emp.mgr%TYPE, v_emp_hiredate IN emp.hiredate%TYPE, v_emp_sal IN emp.sal%TYPE, v_emp_comm IN m% TYPE, v_dept_no IN emp.deptno%TYPE) IS
在数据库的安全控制下可被 应用调用 在forms级安全控制下可被Forms 应用调用 不可以调用Forms的过程 可以调用存储过程
⑵ 创建过程的语法
CREATE [OR REPLACE] PROCEDURE [模式名.]过 程名 [(参数名 [IN | OUT | IN OUT] 数据类型 …)] {IS | AS} [说明部分] BEGIN 语句序列 [EXCEPTION 例外处理] END [过程名];
注释:
● 请注意所有输出参数在过程体中的用法,总是出现在 select语句中的 INTO关键字后面,或出现在赋值语句的左边。
例子: 利用 IN OUT参数在调用者和过程之间传递值 将一个7位数字转换成标准格式的电话号码。
CREATE OR REPLACE PROCEDURE add_dash (v_phone_no IN OUT VARCHAR2) IS BEGIN v_phone_no:=SUBSTR (v_phone_no,l,3) ||„-‟|| SUBSTR (v_phone_no,4,4); END add_dash;

PLSQL程序设计

PLSQL程序设计
通过PL/SQL编写的存储过程和触发器可以 用于实现数据访问控制,确保数据的安全性量数据类型
包括数值型(如NUMBER)、字符型(如VARCHAR2)、 日期型(如DATE)等。
01
集合数据类型
包括表、数组和集合,用于存储多个值。
02
03
自定义数据类型
使用COMMIT语句可以提交事务,将所有未提交的更改永久保存到数据库中。
感谢您的观看
THANKS
循环读取
使用循环结构(如WHILE循环)逐行读取游标中的数据。
异常处理
在读取游标数据时,应处理可能出现的异常,以确保程序的健壮 性。
游标的关闭
关闭游标
使用CLOSE语句关闭游标,释放与 游标相关的资源。
清理资源
关闭游标后,应释放所有与游标相关 的变量和资源,以避免内存泄漏。
06
PL/SQL事务处理
BEFORE触发器
在指定的事件(如INSERT、UPDATE或DELETE)之前执行的操作。
AFTER触发器
在指定的事件之后执行的操作。
INSTEAD OF触发器
用于视图,当对视图进行修改操作时,触发器中的操作替代了原本 的修改操作。
触发器的应用场景
数据完整性维护
触发器可用于确保数据的完整性,例如, 在更新员工工资时自动计算并更新员工
的总收入。
条件约束
触发器可用于实现复杂的业务规则, 例如,限制某些用户不能删除其他用
户的记录。
自动日志记录
触发器可以在数据修改时自动记录操 作日志,便于跟踪数据变更历史。
数据转换
触发器可以在数据修改时自动进行数 据转换或格式化,例如,将日期字段 自动转换为特定的格式。
05

PL SQL 程序设计

PL SQL 程序设计

使用 SELECT INTO 进行赋值
还可以按如下方法使用 SELECT INTO 对变量赋值
SELECT <列名> INTO <变量名> FROM <表名> WHERE <条件>;
示例
SELECT first_fare INTO oldfare FROM fare WHERE route_code = ‘SAN-LOU’;

PL/SQL中的逻辑操作符
operator AND operation 两个条件都必须满足
OR
NOT
只要满足两个条件中的一个
取反
注释的使用
添加注释可以提高程序的可读性并帮助
理解
PL/SQL 支持两种注释样式

单行注释
可以在行中的任何地方以双分号 (--) 开始 可以扩展到行尾

多行注释
PL/SQL 结构
一个标准 PL/SQL 代码段称作程序块 一个程序块是由三个部分或节构成的

声明部分
可执行部分


异常处理部分
PL/SQL 结构
DECLARE 声明 BEGIN 可执行语句 EXCEPTION 例外处理程序 END; PL/SQL 程序块的一部分
PL/SQL 结构
声明部分
操作符
与其他程序设计语言相同,PL/SQL有一系列操 作符。操作符分为下面几类: 1)算术操作符 2)关系操作符 3)比较操作符 4)逻辑操作符
PL/SQL中的算术操作符如下表
operator operation 加 减 除 乘
+ / *
**
乘方
PL/SQL中的关系操作符

PL/SQL程序设计

PL/SQL程序设计

PL/SQL程序设计PL/SQL是一种数据库编程语言,广泛应用于Oracle数据库管理系统中。

它是SQL的一种扩展,添加了过程性编程的特性,允许开发者创建更复杂、可重用的程序逻辑。

PL/SQL程序设计可以分为以下几个方面:1.PL/SQL的基本概念:PL/SQL是过程性语言和SQL结构的结合。

它使用块的概念,一个块由一个可选的声明部分、一个执行部分和一个可选的异常处理部分组成。

PL/SQL程序可以包含变量、常量、游标和异常处理等元素。

2.变量和数据类型:在PL/SQL中,可以通过声明变量来存储和操作数据。

PL/SQL中支持多种数据类型,包括基本的整型、字符型、日期型等,还可以自定义记录类型和表类型。

使用变量可以在程序中存储临时数据,进行运算和逻辑判断。

3.控制结构:PL/SQL支持多种控制结构,包括条件语句、循环语句和异常处理语句。

条件语句可以根据一些条件来执行不同的操作。

循环语句可以重复执行一段代码,直到满足退出条件为止。

异常处理语句用于捕获和处理运行时错误,保证程序的健壮性。

4.子程序:PL/SQL中的子程序可以是存储过程、函数或触发器。

存储过程是一段可重用的代码块,它可以在数据库中存储和调用。

函数是一个具有返回值的子程序,可以在SQL语句中使用。

触发器是与表相关联的特殊存储过程,当满足特定的条件时自动触发。

5.游标和异常处理:PL/SQL中的游标用于处理查询结果集。

游标可以使用循环语句来遍历结果集,并进行相应的操作。

异常处理是PL/SQL的一大特点,它可以有效地捕获和处理运行时错误。

在异常处理部分,可以指定对应不同类型错误的处理方式,例如日志记录、回滚事务等。

6.包和包体:PL/SQL中的包是一种逻辑上的封装,它可以包含变量、常量、游标和子程序等。

包体是包的实现部分,声明和定义了包中的各个元素。

使用包可以将相关的数据和逻辑组织在一起,提供更好的可维护性和可重用性。

7.异常处理和日志记录:在实际的PL/SQL开发中,异常处理是非常重要的。

PLSQL语法以及程序编写介绍

PLSQL语法以及程序编写介绍

NCHAR:来存储Unicode字符集的定长 字符型数据,长度<= 1000 字节。它的声明 方式与CHAR相同。 NVARCHAR2:用来存储Unicode字符 集的变长字符型数据,长度<= 1000 字节。 它的声明方式与VARCHAR2相同。 LONG:用来存储最大长度为2GB的变 长字符数据。
七、条件逻辑 在PL/SQL中,可以使用命令if,else和elsif来控 制可执行命令段的命令流。下面列出了可用的条 件逻辑命令的格式(循环条件除外) 格式1: if <条件> then <命令> elsif <条件> then <命令> else <命令> end if;
格式2: if <条件> then if <条件> then <命令> end if; else <命令> end if; 总的说来除了格式上与C略有区别,其它都 是一样的
实际数据
7456123.89 7456123.89 பைடு நூலகம்456123.89 7456123.89 7456123.89 7456123.89 7456123.89
定义
NUMBER NUMBER(9) NUMBER(9,2) NUMBER(9,1) NUMBER(6) NUMBER(7,-2) NUMBER(7,2)
area_id
1 2
addr_zipcode
325200 325400
3
4 5 6 7 8
325800
325100 325600 325700 325300 325500
其他
325000
八、循环 在一个单独的PL/SQL代码块中可以使用 循环处理多个记录。PL/SQL支持三种类型 的循环。 简单循环

PL╱SQL程序设计

PL╱SQL程序设计

PL/SQL程序设计目录第一章PL/SQL 程序设计简介 (4)§1.2SQL与PL/SQL (4)§1.2.1 什么是PL/SQL? (4)§1.2.1 PL/SQL的好处 (4)§1.2.2 PL/SQL 可用的SQL语句 (5)§1.3运行PL/SQL程序 (5)第二章PL/SQL块结构和组成元素 (6)§2.1PL/SQL块 (6)§2.2PL/SQL结构 (6)§2.3标识符 (6)§2.4PL/SQL变量类型 (7)§2.4.1 变量类型 (7)§2.4.2 复合类型 (9)§2.4.3 使用%ROWTYPE (11)§2.4.4 LOB类型* (11)§2.4.5 Bind 变量 (11)§2.4.6 INDEX BY TABLES (12)§2.4.7 数据类型的转换* (13)§2.5运算符和表达式(数据定义) (13)§2.5.1 关系运算符 (13)§2.5.2 一般运算符 (13)§2.5.3 逻辑运算符 (14)§2.6变量赋值 (14)§2.6.1 字符及数字运算特点 (14)§2.6.2 BOOLEAN 赋值 (14)§2.6.3 数据库赋值 (14)§2.6.4 可转换的类型赋值 (15)§2.7变量作用范围及可见性 (15)§2.8注释 (16)§2.9简单例子 (17)§2.9.1 简单数据插入例子 (17)§2.9.2 简单数据删除例子 (17)第三章PL/SQL流程控制语句 (18)§3.1条件语句 (18)§3.2CASE表达式 (19)§3.3循环 (19)§3.3标号和GOTO (21)§3.4NULL语句 (21)第四章游标的使用 (23)§4.1游标概念 (23).1 处理显式游标 (23)§4.1.2 处理隐式游标 (26)§4.1.3 游标修改和删除操作 (27)第五章异常错误处理 (29)§5.1异常处理概念 (29)§5.1.1 预定义的异常处理 (29)§5.1.2 非预定义的异常处理 (30)§5.1.3 用户自定义的异常处理 (31)§5.1.4 用户定义的异常处理 (32)§5.2异常错误传播 (33)§5.2.1 在执行部分引发异常错误 (33)§5.2.2 在声明部分引发异常错误 (34)§5.3异常错误处理编程 (34)§5.4在PL/SQL中使用SQLCODE,SQLERRM (35)第六章存储函数和过程 (36)§6.1引言 (36)§6.2创建函数 (36)§6.3存储过程 (39)§6.3.1 创建过程 (39)§6.3.2 调用存储过程 (40)§6.3.3 开发存储过程步骤 (42)§6.3.4 与过程相关数据字典 (43)第七章包的创建和应用 (44)§7.1引言 (44)§7.2包的定义 (44)§7.3包的开发步骤 (45)§7.4包定义的说明 (45)§7.5子程序重载 (48)§7.6删除过程、函数和包 (50)§7.7包的管理 (50)第八章触发器 (51)§8.1触发器类型 (51)§8.1.1 DML触发器 (51)§8.1.2 替代触发器 (51)§8.1.3 系统触发器 (51)§8.2创建触发器 (51)§8.2.1 触发器触发次序 (53)§8.2.2 创建DML触发器 (53)§8.2.3 创建替代(Instead_of)触发器 (54)§8.2.3 创建系统事件触发器 (54)§8.2.4 系统触发器事件属性 (55)§8.2.5 使用触发器谓词 (56)§8.2.6 重新编译触发器 (56)§8.3删除和使能触发器 (56)§8.4触发器和数据字典 (57)§8.5数据库触发器的应用举例 (57)第一章PL/SQL 程序设计简介PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

必须说明
必须说明
调用过程时,实际参数取值 过程结束时,形参的内容 被传递给过程。过程结束时, 将赋给实参。把值返回给 形参的内容将赋给实参。把 调用环境。 值返回给调用环境。 形式参数不能被初始化, 只能被赋值。当过程调用 实际参数变量必须初始化。 时,实参中具有的任何值 将被忽略。 实际参数必需是变量 实际参数必需是变量。
成都信息工程大学 软件工程学院
过程函数

实际参数(Actual parameters):在调用过程中作为参数传 递给过程的变量或表达式就是实际参数。
DECLARE
v_no emp.empno%TYPE:=10000, v_name emp.ename%TYPE :=‘Jones’, v_job emp.job%TYPE := 'SALESMAN',
• 执行
DECLARE v_empno emp.empno%TYPE:=&no; BEGIN raise_salary(v_empno); END;
成都信息工程大学 软件工程学院
过程函数
• 例子
CREATE OR REPLACE PROCEDURE query_emp (p_id IN emp.empno%TYPE, p_name OUT emp.ename%TYPE, p_salary OUT emp.sal%TYPE,p_comm OUT m%TYPE) IS BEGIN SELECT ename, sal, comm INTO p_name, p_salary, p_comm FROM emp WHERE empno = p_id;
• 执行:
过程函数
• 例子
CREATE OR REPLACE PROCEDURE add_dept (p_name IN dept.dname%TYPE DEFAULT 'unknown', p_loc IN dept.loc%TYPE DEFAULT 'NEW YORK') IS BEGIN INSERT INTO dept (deptno,dname, loc) VALUES (dept_seq.NEXTVAL, p_name, p_loc); END add_dept;
过程函数
• 例子
CREATE OR REPLACE PROCEDURE raise_salary (p_id IN emp.empno%TYPE) BEGIN UPDATE emp END raise_salary; SET sal = sal * 1.10 WHERE empno = p_id; IS
成都信息工程大学 软件工程学院
过程函数
• 子程序是带名的PL/SQL块,能够接受参数和被环境调用。在PL/SQL
中两类子程序:过程和函数
<header>
IS | AS
声明部分 BEGIN 执行部分 EXCEPTION (可选) 异常处理部分 END;
子程序说明
子程序体
成都信息工程大学 软件工程学院
CREATE OR REPLACE PROCEDURE ParameterLength ( p_Parameter1 IN OUT VARCHAR2(10), p_Parameter2 IN OUT NUMBER(3,2)) AS BEGIN p_Parameter1 := 'abcdefghijklm'; p_Parameter2 := 12.3; END ParameterLength; / 过程声明非法
过程函数

形式参数(Formal parameters):在过程中声明的参数就是形式 参数。
CREATE OR REPLACE PROCEDURE insert_emp (no emp.empno%TYPE, Job emp.job%TYPE, name emp.ename%TYPE, mgr emp.mgr%TYPE,
v_mgr emp.mgr%TYPE :=7369,
v_hiredate emp.hiredate%TYPE :=SYSDATE, v_salary emp.sal%TYPE := 800, v_comm m%TYPE :=NULL,
v_deptno emp.deptno%TYPE :=10
exception_handlers;] END [procedure_name];
3.存储过程定义完成后需要调用 才能执行过程内部的代码。
成都信息工程大学 软件工程学院
过程函数

IS
Example 创建存储过程,输出系统的日期和时间
CREATE OR REPLACE PROCEDURE display_time BEGIN dbms_output.put_line(systimestamp); END display_time;
END query_emp;
成都信息工程大学 软件工程学院
过程函数
• 执行
DECLARE v_empno emp.empno%TYPE:=&no; v_name emp.ename%TYPE; v_salary emp.sal%TYPE; v_comm m%TYPE;
BEGIN
query_emp(v_empno,v_name,v_salary,v_comm); dbms_output.put_line(v_empno||' '||v_name||' '||v_salary||' '||v_comm); END;
不能分配缺省值 不能分配缺省值 成都信息工程大学 软件工程学院
过程函数

PL/SQL子程序程参数的三种模式及特点:
◦ IN用于向程序传递数据,参数在程序内部不能赋值
◦ OUT用于从程序内获取数据,参数在程序内部赋值 前是null ◦ IN OUT 用于向程序传递数据和从程序内获取数据
成都信息工程大学 软件工程学院
• 执行:SQL>BEGIN
add_dept; add_dept ('TRAINING'); add_dept ( p_loc =>'BOSTON ', p_name => 'EDUCATION'); add_dept ( p_loc => 'CHICAGO') ; END; / SQL>SELECT * FROM dept; 成都信息工程大学
• 使用三种方式调用上面创建的存储过程
• • •
方式一:使用sqlplus命令EXECUTE(简写EXEC) 调用 EXECUTE display_time; 方式二:使用sql命令CALL调用 CALL display_time( ); 方式三:在PL/SQL块中调用 BEGIN display_time; END; 成都信息工程大学 软件工程学院
hiredate emp.hiredate%TYPE , salary emp.sal%TYPE ,
comm m%TYPE , ) IS BEGIN INSERT INTO emp VALUES(no,name,job,mgr,hiredate,salary,comm,deptno); END; deptno emp.deptno%TYPE
过程函数
• 子程序说明(header)决定 : – PL/SQL子程序的类型是过程还是函数。 – 子程序的名称 – 参数列表 – 当子程序是函数时必须要有返回值(使用RETURN
子句)

关键字IS或AS是必须的。
成都信息工程大学 软件工程学院
过程函数

子程序体:是一个拥有声明、执行和异常处理部分的 PL/SQL块。
– 声明部分介于IS|AS和BEGIN之间。在匿名块中必 须使用DECLARE关键字显示的指出声明部分,而在子 程序中没有DECLARE关键字。
– 执行部分介于BEGIN和END关键字之间,这部分
必EPTION和 END之间是可选 的部分
成都信息工程大学 软件工程学院
过程函数
• 语法
CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter1 [IN | OUT | IN OUT] data_type , parameter2 [IN | OUT | IN OUT] data-_type,…)] IS |AS 注意与匿名块有三点区别: [declaration_section;] 1.无DECLARE关键字 BEGIN executable_section; 2.在END后面可以加过程名 作为 定义结束的标志 [EXCEPTION
BEGIN insert_emp(v_no, v_name, v_job, v_mgr, v_hiredate, v_salary, v_comm, v_deptno ); END;
成都信息工程大学 软件工程学院
过程函数

对形式参数的约束:在过程声明中,限制CHAR和 VARCHAR2参数的长度以及限制NUMBER参数的精度和/ 或刻度范围都是非法的。
软件工程学院
过程函数 例8.4 为scott.emp表创建一个能完成插入功能的存储过程insert_emp。 CREATE OR REPLACE PROCEDURE insert_emp 注意:在参数的定义 (no IN scott.emp.empno%TYPE, 上,除了向主键字段 name IN scott.emp.ename%TYPE DEFAULT NULL, empno插入值的变量 job IN scott.emp.job%TYPE DEFAULT 'SALESMAN', no没有设置默认值外 mgr IN scott.emp.mgr%TYPE DEFAULT 7369, ,其他所有的变量都 给出了默认值,这样 hiredate scott.emp.hiredate%TYPE DEFAULT SYSDATE, 当用户调用该存储过 salary scott.emp.sal%TYPE DEFAULT 800, 程时,可以指定任意 comm m%TYPE DEFAULT NULL, deptno scott.emp.deptno%TYPE DEFAULT 10) IS 个数的实参。 e_integrity EXCEPTION; PRAGMA EXCEPTION_INIT (e_integrity,-2291); BEGIN INSERT INTO scott.emp VALUES(no,name,job,mgr,hiredate,salary,comm,deptno); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN dbms_output.put_line('该员工已经存在!'); WHEN e_integrity THEN dbms_output.put_line('部门编号填写错误!'); 成都信息工程大学 软件工程学院 END;
相关文档
最新文档