第10章 存储过程、函数和包

合集下载

全国计算机等级考试二级教程 opengauss数据库程序设计

全国计算机等级考试二级教程 opengauss数据库程序设计

全国计算机等级考试二级教程OpenGauss 数据库程序设计主要包括以下内容:
1. OpenGauss 数据库概述:介绍OpenGauss 数据库的发展历程、特点和应用领域,为后续的学习打下基础。

2. OpenGauss 数据库系统架构:详细讲解OpenGauss 数据库的系统架构,包括服务器架构、存储引擎、事务处理、并发控制等关键组件。

3. OpenGauss 数据库SQL 语言:介绍OpenGauss 数据库的SQL 语言,包括数据定义语言(DDL)、数据操作语言(DML)、数据控制语言(DCL)等,以及SQL 语言的语法、功能和特点。

4. OpenGauss 数据库存储过程和函数:介绍OpenGauss 数据库的存储过程和函数,包括创建、调用、管理和维护存储过程和函数的方法,以及存储过程和函数的应用场景和性能优化。

5. OpenGauss 数据库备份与恢复:介绍OpenGauss 数据库的备份与恢复机制,包括备份类型、备份策略、恢复方法等,以确保数据的可靠性和完整性。

6. OpenGauss 数据库性能优化:介绍OpenGauss 数据库的性能优化方法,包括查询优化、索引优化、系统参数调整等,以提高数据库系统的性能和响应速度。

7. OpenGauss 数据库安全:介绍OpenGauss 数据库的安全机制,包括用户管理、权限管理、数据加密等,以确保数据库系统的安全性和可靠性。

通过以上内容的学习,考生可以掌握OpenGauss 数据库的基本概念和原理,熟悉SQL 语言的使用,了解存储过程和函数的应用,掌握备份与恢复的方法,掌握性能优化的技巧,以及了解安全机制的应用。

oracle存储过程介绍

oracle存储过程介绍

存储过程优点(2)
4)重复使用。存储过程可以重复使用,从而可以减少数 据库开发人员的工作量。 5)灵活:使用存储过程,可以实现存储过程设计和编码 工作分开进行,只要将存储过程名、参数、及返回信 息告诉编码人员即可。
存储过程缺点(1)
1)移植性差:使用存储过程封装业务逻辑将限制应用程 序的可移植性; 2)维护成本高:如果更改存储过程的参数或者其返回的 数据及类型的话,需要修改应用程序的相关代码,比 较繁琐。
执行存储过程

执行存储过程语法: ,...]);
CALL/PERFORM Procedure 过程名([参数1,参数2

在PL/SQL中,数据库服务器支持在过程体中调用其他 存储过程 使用CALL或者PERFORM等方式激活存储过程的执行。 调用时”()”是不可少的,无论是有参数还是无参数。


过程名:数据库服务器合法的对象标识 参数列表:用名字来标识调用时给出的参数值,必须 指定值的数据类型。参数也可以定义输入参数、输出 参数或输入/输出参数。默认为输入参数。 过程体:是一个<PL/SQL块>。包括声明部分和可执 行语句部分 ;不用 declare 语句
创建存储过程(2)
例子: [例1] 利用存储过程来实现下面的应用: 从一个账户转指定数额的款项到 另一个账户中。 CREATE PROCEDURE TRANSFER(inAccount INT, outAccount INT , amount FLOAT) AS totalDeposit FLOAT; BEGIN /* 检查转出账户的余额 */ SELECT total INTO totalDeposit FROM ACCOUNT WHERE ACCOUNTNUM=outAccount; IF totalDeposit IS NULL THEN /* 账户不存在或账户中没有存款 */ ROLLBACK; RETURN; END IF;

oracle 存储过程 相互调用 注意事项

oracle 存储过程 相互调用 注意事项

Oracle存储过程相互调用注意事项1. 简介Oracle存储过程是一种存储在数据库中的预编译程序,它能够接收输入参数并执行数据库操作。

在实际应用中,经常会遇到需要一个存储过程调用另一个存储过程的情况。

本文将介绍在Oracle数据库中存储过程相互调用的注意事项,帮助开发人员有效地处理这一问题。

2. 合理设计存储过程在进行存储过程相互调用前,首先需要合理设计存储过程。

每个存储过程应当具有明确的功能和输入输出参数,避免一个存储过程功能过于庞大,造成不易维护和调用。

为了方便相互调用,可以将一些公共逻辑抽象成一个单独的存储过程,方便其他存储过程调用。

3. 考虑存储过程间的依赖关系在进行存储过程相互调用时,需要考虑存储过程之间的依赖关系。

如果存储过程A需要先执行存储过程B,那么在调用存储过程A时,需要先确保存储过程B已经执行。

在设计存储过程时,应该明确存储过程之间的依赖关系,避免出现循环调用或者无法满足依赖关系的情况。

4. 使用事务控制在存储过程相互调用过程中,往往会涉及到对数据库的数据操作。

为了保证数据的一致性和完整性,可以使用事务控制来确保多个存储过程执行的原子性。

在存储过程中使用BEGIN...END语句包裹多个存储过程的调用,然后使用COMMIT或ROLLBACK语句来统一提交或回滚事务。

5. 处理异常情况在存储过程相互调用时,可能会出现各种异常情况,比如存储过程执行失败、参数错误等。

因此在进行存储过程相互调用时,需要考虑如何处理异常情况。

可以使用异常处理语句来捕获异常并做相应的处理,比如记录日志、返回错误信息等。

6. 参数传递和返回值在存储过程相互调用时,需要注意参数的传递和返回值的获取。

确保参数的类型和值能够正确传递到被调用的存储过程中,并能够正确获取被调用存储过程的返回值。

可以使用IN、OUT或者IN OUT参数来传递值,并使用RETURN语句来返回值。

7. 性能优化在进行存储过程相互调用时,需要考虑性能优化的问题。

存储过程与函数的构建与使用

存储过程与函数的构建与使用

存储过程与函数的构建与使用存储过程和函数是数据库中常用的两种程序化对象,它们都可以用来封装一定的复杂业务逻辑,在数据库中进行复用,提高数据库的性能和可维护性。

1. 存储过程的构建和使用存储过程是一种预编译的数据库对象,可以用来执行一些具体的操作。

在构建存储过程时,需要用到以下的语法结构:CREATE PROCEDURE procedure_name@parameter datatype(size) = default_value,ASBEGINSQL statementsEND1. 创建存储过程的语法是“CREATE PROCEDURE 存储过程名”。

其中,存储过程名是自己定义的,应该符合命名规范。

2. 存储过程可以包含输入输出参数,所以需要在存储过程中定义参数的数据类型和默认值。

3. SQL语句块始终包含在BEGIN和END语句之间,并以AS语句开头。

构建完存储过程后,就可以使用以下的语句来调用存储过程:EXEC procedure_name parameter1, parameter2, ...其中,parameter1、parameter2等是存储过程中定义的参数。

执行上述语句后,存储过程会按照自己的逻辑进行处理。

2. 函数的构建和使用函数是一种特殊的存储过程,它返回一个值,常用于数据处理过程中。

在构建函数时,需要用到以下的语法结构:CREATE FUNCTION function_name (@parameter datatype(size)) RETURNS datatype(size)ASBEGINSQL statementsEND1. 函数的创建语法是“CREATE FUNCTION 函数名”。

函数名应该符合命名规范。

2. 函数返回一个值,因此需要在函数中定义返回值的数据类型。

3. SQL语句块始终包含在BEGIN和END语句之间,并以AS语句开头。

构建完函数后,就可以使用以下的语句来调用存储过程:SELECT dbo.function_name(parameter)其中,parameter是函数中定义的参数。

存储过程、函数与触发器操作答案

存储过程、函数与触发器操作答案

《存储过程、函数与触发器操作》实验一、实验目的与要求1、掌握存储过程的使用。

2、掌握函数的使用。

3、掌握触发器操作。

三、实验内容一、存储过程1、在“教务管理系统”数据库中创建一个名为ProcStudentInfo的存储过程,它返回学生的学号、姓名、性别、班级编号、年级和籍贯信息。

CREATE PROCEDURE Proc_StudentInfoASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息2、用EXECUTE执行Proc_StudentInfo存储过程。

EXECUTE Proc_StudentInfo3、创建一个存储过程,用于返回“教务管理系统”数据库上某个班级中所有学生的信息。

CREATE PROCEDURE Proc_GetClassStudent1@ClassID varchar(14)ASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassID4、创建一个存储过程,用于返回“教务管理系统”数据库上某个班级中所有学生的信息,默认班级编号为'20031340000102' 。

CREATE PROCEDURE Proc_GetClassStudent2@ClassID varchar(14)= '20031340000102'ASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassIDEXECUTE Proc_GetClassStudent2 '20031340000103'5、创建一个返回执行代码为100的存储过程。

CREATE PROCEDURE Proc_GetClassStudent4@ClassID varchar(14)ASBEGINSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassIDRETURN 100END6、执行存储过程Proc_GetClassStudent2和Proc_GetClassStudent4,并定义两个个变量存储执行返回代码。

实验训练5:存储过程与函数的构建与使用

实验训练5:存储过程与函数的构建与使用

实验训练5:存储过程与函数的构建与使用一、存储过程与函数的概念存储过程和函数都是数据库中的可执行代码,可以被多次调用和重复使用。

存储过程是一组预定义的SQL语句集合,可以在数据库中定义和存储。

而函数是一个独立的代码块,它接收输入参数并返回一个值。

二、存储过程的构建与使用1. 创建存储过程在MySQL中,创建存储过程需要使用CREATE PROCEDURE语句。

例如:CREATE PROCEDURE myproc()BEGINSELECT * FROM mytable;END;这个例子创建了一个名为myproc的存储过程,它会查询mytable表中的所有数据。

2. 调用存储过程使用CALL语句可以调用已经创建好的存储过程。

例如:CALL myproc();这个语句会执行myproc存储过程中定义的SQL语句。

3. 存储过程参数我们可以给存储过程添加参数来使其更加灵活。

例如:CREATE PROCEDURE myproc(IN p1 INT, IN p2 VARCHAR(50)) BEGINSELECT * FROM mytable WHERE column1 = p1 AND column2 = p2;END;这个例子创建了一个带有两个输入参数p1和p2的存储过程,它会查询mytable表中column1等于p1并且column2等于p2的数据。

4. 存储过程变量除了参数之外,存储过程还可以使用变量来存储中间结果。

例如:CREATE PROCEDURE myproc(IN p1 INT)BEGINDECLARE v1 INT;SET v1 = p1 * 2;SELECT * FROM mytable WHERE column1 = v1;END;这个例子创建了一个带有一个输入参数p1和一个变量v1的存储过程,它会将p1乘以2并将结果存储在v1变量中,然后查询mytable表中column1等于v1的数据。

Oracle12c中文版数据库管理、应用与开发实践教程附录思考与练习答案


二、选择题
1.A 3.A
2.B 4.C
5.A
第 7 章 PL/SQL 编程基础
一、填空题
1.DECLARE 3.%TYPE 5./ 7.隔离性
2.CONSTANT 4.120 6.GOTO
二、选择题
1.B 3.C 5.D
2.A 4.A
第 8 章 内置函数
一、填空题
1.123EFG321 2.G3 3.CONCAT() 4.TRUNC() 5.SYSDATE 6.DROP FUNCTION
二、选择题
1.B 3.C 5.A 7.A
2.A 4.B 6.C
第 12 章 其他的数据库对象
一、填空题
1.WITH CHECK OPTION 2.位图索引 3.NEXTVAL 4.私有 Oracle 同义词 5.相对文件号
附 录
411
412
Oracle 12c 中文版数据库管理、应用与开发实践教程
第 2 章 Oracle 数据库管理工具
一、填空题
1.1521 3.lsnrctl status 5.DEFINE
2.tnsnames.ora 4.DESC 6.DISCONNECT
二、选择题
1.C 3.C 5.C
2.D 4.A 6Leabharlann B第 5 章 多表查询和子查询
一、填空题
1.全外连接
2.自连接
3.INTERSECT 4.INNER JOIN
附录 思考与练习答案
第 1 章 Oracle 12c 简介
一、填空题
1.标准版 1 3.PGA 5.服务器进程
2.数据库主服务 4.数据库缓冲区 6.配置参数文件
二、选择题
第 4 章 单表查询

存储过程学习资料

sqlserver 存储过程学习资料一2009-01-12 10:44:02| 分类:数据库|字号订阅CREATE PROCEDURE创建存储过程,存储过程是保存起来的可以接受和返回用户提供的参数的Transact-SQL 语句的集合。

可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。

也可以创建在Microsoft SQL Server启动时自动运行的存储过程。

语法CREATE PROC [ EDURE ] procedure_name [ ; number ][ { @parameter data_type }[ VARYING ] [ = default ] [ OUTPUT ]] [ ,...n ][ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ][ FOR REPLICATION ]AS sql_statement [ ...n ]参数procedure_name新存储过程的名称。

过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。

有关更多信息,请参见使用标识符。

要创建局部临时过程,可以在procedure_name 前面加一个编号符(#procedure_name),要创建全局临时过程,可以在procedure_name 前面加两个编号符(##procedure_name)。

完整的名称(包括# 或##)不能超过128 个字符。

指定过程所有者的名称是可选的。

;number是可选的整数,用来对同名的过程分组,以便用一条DROP PROCEDURE 语句即可将同组的过程一起除去。

例如,名为orders 的应用程序使用的过程可以命名为orderproc;1、orderproc;2 等。

DROP PROCEDURE orderproc 语句将除去整个组。

如果名称中包含定界标识符,则数字不应包含在标识符中,只应在procedure_name 前后使用适当的定界符。

《MySQL数据库原理、设计与应用》第10章课后习题答案

第十章一、填空题1.92. e3.@,变量名4.REPEAT5.DELIMITER二、判断题1.错2.错3.对4.对5.对三、选择题1. A2. D3. D4. C5. B四、简答题1.请简述存储过程和函数的区别。

答:(1)语法中实现的标识符不同,存储过程使用PROCEDURE,函数为FUNCTION。

(2)存储过程在创建时没有返回值,而函数在定义时必须设置返回值。

(3)存储过程没有返回值类型,且不能将结果直接赋值给变量;而函数定义时需要设置返回值类型,且在调用时除在SELECT中,必须将返回值赋给变量。

(4)存储过程必须通过CALL进行调用,不能使用SELECT调用;而函数则可在SELECT语句中直接使用。

2.请说一说触发器以及其作用。

答:概念:触发器可以看作是一种特殊类型的存储过程,在预先定义好的事件(如INSERT、DELETE等操作)发生时,才会被MySQL自动调用。

作用:①触发器可以通过数据库中的相关表实现级联无痕更改操作。

②保证数据安全,进行安全校验五、实训题11. 请在shop数据库中创建一个存储过程,以订单编号为参数,输出该订单的商品信息。

mysql> DELIMITER $$mysql> CREATE PROCEDURE shop.order_proc(IN order_id INT )-> BEGIN-> SELECT g.id, FROM sh_goods g-> LEFT JOIN sh_order_goods og ON g.id = og.goods_id-> WHERE og.order_id = order_id;-> END-> $$Query OK, 0 rows affected (0.01 sec)mysql> DELIMITER ;2. shop.sh_order_goods表上创建一个触发器,当添加订单-商品信息时,修改sh_goods表中对应商品的库存量。

存储过程的面试题

存储过程的面试题在数据库管理系统(DBMS)中,存储过程是一组预定义的SQL语句集合,可以在数据库中存储并且以单个单元的形式进行调用。

它们可以完成复杂的操作并且提供了许多好处,如简化数据库操作、提高性能和安全性等。

当你准备参加存储过程的面试时,可能会面临一些与存储过程相关的问题。

本文将介绍一些常见的存储过程面试题,并提供了详细的解答。

问题一:什么是存储过程?存储过程是一组预定义的SQL语句集合,存储在数据库中。

它们可以被视为一个函数,接收输入参数并且返回结果。

存储过程可以由应用程序通过调用数据库的API调用。

问题二:存储过程和函数之间有什么区别?存储过程和函数之间的主要区别在于函数返回一个值给调用者,而存储过程不返回值给调用者。

存储过程通常用于执行一系列的操作,比如插入、更新或删除数据。

另外,存储过程可以接收输出参数,这些参数可以在存储过程执行完毕后传递给调用者。

问题三:存储过程的优点是什么?存储过程有以下几个优点:1. 提高性能:存储过程可以在数据库中进行预编译,这意味着当存储过程被调用时,它们已经被编译并且存储在内存中。

这样可以节省解析和编译的时间,从而提高性能。

2. 简化复杂的操作:存储过程可以执行复杂的操作,如事务处理和错误处理。

它们可以将复杂的业务逻辑封装在一个单独的单元中,并且可以在多个地方进行调用。

3. 提高安全性:存储过程可以限制对数据库的直接访问,只允许通过存储过程访问数据库。

这样可以提高数据的安全性,防止恶意操作和注入攻击。

4. 降低维护成本:存储过程可以在数据库中进行维护和更新,这样可以方便地对其进行修改和调整,而不需要修改应用程序的代码。

问题四:存储过程如何调用?存储过程可以通过数据库的API调用或者SQL语句进行调用。

以下是两种常见的调用方法:1. 使用数据库的API调用:不同的数据库提供了不同的API来调用存储过程。

例如,在MySQL中可以使用CALL语句调用存储过程,而在Oracle中可以使用EXECUTE语句调用存储过程。

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

第10章存储过程、函数和包存储过程(PROCEDURE)、函数(FUNCTION)和包(PAKAGE)是以编译的形式存储在数据库中的数据库的对象,并成为数据库的一部分,可作为数据库的对象通过名字被调用和访问。

存储过程通常是实现一定功能的模块;函数通常用于计算,并返回计算结果;包分为包头和包体;用于捆绑存放相关的存储过程和函数,起到对模块归类打包的作用。

存储过程、函数和包是数据库应用程序开发的重要方法,三者既有区别,也有联系。

✧存储过程和存储函数。

✧过程的参数和调用。

✧包和包的应用。

10.1 存储过程和函数存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块。

但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的。

10.1.1 认识存储过程和函数和PL/SQL程序相比,存储过程有很多优点,具体归纳如下:·存储过程和函数以命名的数据库对象形式存储于数据库当中。

存储在数据库中的优点是很明显的,因为代码不保存在本地,用户可以在任何客户机上登录到数据库,并调用或修改代码。

·存储过程和函数可由数据库提供安全保证,要想使用存储过程和函数,需要有存储过程和函数的所有者的授权,只有被授权的用户或创建者本身才能执行存储过程或调用函数。

·存储过程和函数的信息是写入数据字典的,所以存储过程可以看作是一个公用模块,用户编写的PL/SQL程序或其他存储过程都可以调用它(但存储过程和函数不能调用PL/SQL 程序)。

一个重复使用的功能,可以设计成为存储过程,比如:显示一张工资统计表,可以设计成为存储过程;一个经常调用的计算,可以设计成为存储函数;根据雇员编号返回雇员的姓名,可以设计成存储函数。

·像其他高级语言的过程和函数一样,可以传递参数给存储过程或函数,参数的传递也有多种方式。

存储过程可以有返回值,也可以没有返回值,存储过程的返回值必须通过参数带回;函数有一定的数据类型,像其他的标准函数一样,我们可以通过对函数名的调用返回函数值。

存储过程和函数需要进行编译,以排除语法错误,只有编译通过才能调用。

10.1.2 创建和删除存储过程创建存储过程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系统权限。

该权限可由系统管理员授予。

创建一个存储过程的基本语句如下:CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数[IN|OUT|IN OUT]数据类型…)]{AS|IS}[说明部分]BEGIN可执行部分[EXCEPTION错误处理部分]END [过程名];其中:可选关键字OR REPLACE表示如果存储过程已经存在,则用新的存储过程覆盖,通常用于存储过程的重建。

参数部分用于定义多个参数(如果没有参数,就可以省略)。

参数有三种形式:IN、OUT 和IN OUT。

如果没有指明参数的形式,则默认为IN。

关键字AS也可以写成IS,后跟过程的说明部分,可以在此定义过程的局部变量。

编写存储过程可以使用任何文本编辑器或直接在SQL *Plus环境下进行,编写好的存储过程必须要在SQL *Plus环境下进行编译,生成编译代码,原代码和编译代码在编译过程中都会被存入数据库。

编译成功的存储过程就可以在Oracle环境下进行调用了。

一个存储过程在不需要时可以删除。

删除存储过程的人是过程的创建者或者拥有DROP ANY PROCEDURE系统权限的人。

删除存储过程的语法如下:DROP PROCEDURE 存储过程名;如果要重新编译一个存储过程,则只能是过程的创建者或者拥有ALTER ANY PROCEDURE 系统权限的人。

语法如下:ALTER PROCEDURE 存储过程名 COMPILE;执行(或调用)存储过程的人是过程的创建者或是拥有EXECUTE ANY PROCEDURE系统权限的人或是被拥有者授予EXECUTE权限的人。

执行的方法如下:方法1:EXECUTE 模式名.存储过程名[(参数…)];方法2:BEGIN模式名.存储过程名 [(参数…)];END;传递的参数必须与定义的参数类型、个数和顺序一致(如果参数定义了默认值,则调用时可以省略参数)。

参数可以是变量、常量或表达式,用法参见下一节。

如果是调用本账户下的存储过程,则模式名可以省略。

要调用其他账户编写的存储过程,则模式名必须要添加。

以下是一个生成和调用简单存储过程的训练。

注意要事先授予创建存储过程的权限。

【训练1】创建一个显示雇员总人数的存储过程。

步骤1:登录SCOTT账户(或学生个人账户)。

步骤2:在SQL *Plus输入区中,输入以下存储过程:CREATE OR REPLACE PROCEDURE EMP_COUNTASV_TOTAL NUMBER;BEGINSELECT COUNT(*) INTO V_TOTAL FROM EMP;DBMS_OUTPUT.PUT_LINE('雇员总人数为:'||V_TOTAL);END;步骤3:按“执行”按钮进行编译。

如果存在错误,对脚本进行修改,直到没有错误产生。

如果编译结果正确,将显示:过程已创建。

步骤4:调用存储过程,在输入区中输入以下语句并执行:EXECUTE MEP_COUNT[说明] 在该训练中,V_TOTAL变量是存储过程定义的局部变量,用于接收查询到的雇员总人数。

[注意] 在SQL *Plus中输入存储过程,按“执行”按钮是进行编译,不是执行存储过程。

如果在存储过程中引用了其他用户的对象,比如表,则必须有其他用户授予的对象访问权限。

一个存储过程一旦编译成功,就可以由其他用户或程序来引用。

但存储过程或函数的所有者必须授予其他用户执行该过程的权限。

存储过程没有参数,在调用时,直接写过程名即可。

【训练2】在PL/SQL程序中调用存储过程。

步骤1:登录SCOTT账户。

步骤2:授权STUDENT账户使用该存储过程,即在SQL *Plus输入区中,输入以下的命令:GRANT EXECUTE EMP_COUNT TO STUDENT步骤3:登录STUDENT账户,在SQL *Plus输入区中输入以下程序:SET SERVEROUTPUT ONBEGINSCOTT.EMP_COUNT;END;步骤4:执行以上程序,结果为:[说明] 在本例中,存储过程是由SCOTT账户创建的,STUDEN账户获得SCOTT账户的授权后,才能调用该存储过程。

[注意] 在程序中调用存储过程,使用了第二种语法。

【训练3】编写显示雇员信息的存储过程EMP_LIST,并引用EMP_COUNT存储过程。

步骤1:在SQL *Plus输入区中输入并编译以下存储过程:CREATE OR REPLACE PROCEDURE EMP_LISTASCURSOR EMP_CURSOR ISSELECT EMPNO,ENAME FROM EMP;BEGINFOR EMP_RECORD IN EMP_CURSOR LOOPDBMS_OUTPUT.PUT_LINE(EMP_RECORD.EMPNO||EMP_RECORD.ENAME);END LOOP;EMP_COUNT;END;步骤2:调用存储过程,在输入区中输入以下语句并执行:EXECUTE EMP_LIST[说明] 以上的EMP_LIST存储过程中定义并使用了游标,用来循环显示所有雇员的信息。

然后调用已经成功编译的存储过程EMP_COUNT,用来附加显示雇员总人数。

通过EXECUTE 命令来执行EMP_LIST存储过程。

[练习1] 编写显示部门信息的存储过程DEPT_LIST,要求统计出部门个数。

10.1.3 参数传递参数的作用是向存储过程传递数据,或从存储过程获得返回结果。

正确的使用参数可以大大增加存储过程的灵活性和通用性。

参数的类型有三种,如表10-1所示。

表10-1 参数的类型参数类型说明IN 定义一个输入参数变量,用于传递参数给存储过程OUT 定义一个输出参数变量,用于从存储过程获取数据IN OUT 定义一个输入、输出参数变量,兼有以上两者的功能参数名 IN 数据类型 DEFAULT 值;定义一个输入参数变量,用于传递参数给存储过程。

在调用存储过程时,主程序的实际参数可以是常量、有值变量或表达式等。

DEFAULT关键字为可选项,用来设定参数的默认值。

如果在调用存储过程时不指明参数,则参数变量取默认值。

在存储过程中,输入变量接收主程序传递的值,但不能对其进行赋值。

参数名 OUT 数据类型;定义一个输出参数变量,用于从存储过程获取数据,即变量从存储过程中返回值给主程序。

在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。

在存储过程中,参数变量只能被赋值而不能将其用于赋值,在存储过程中必须给输出变量至少赋值一次。

参数名 IN OUT 数据类型 DEFAULT 值;定义一个输入、输出参数变量,兼有以上两者的功能。

在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。

DEFAULT关键字为可选项,用来设定参数的默认值。

在存储过程中,变量接收主程序传递的值,同时可以参加赋值运算,也可以对其进行赋值。

在存储过程中必须给变量至少赋值一次。

如果省略IN、OUT或IN OUT,则默认模式是IN。

以下是几个训练实例,以帮助读者学习和了解存储过程和函数的参数的使用和值的传递过程。

【训练4】编写给雇员增加工资的存储过程CHANGE_SALARY,通过IN类型的参数传递要增加工资的雇员编号和增加的工资额。

步骤1:登录SCOTT账户。

步骤2:在SQL *Plus输入区中输入以下存储过程并执行:CREATE OR REPLACE PROCEDURE CHANGE_SALARY(P_EMPNO IN NUMBER DEFAULT 7788,P_RAISE NUMBER DEFAULT 10)ASV_ENAME VARCHAR2(10);V_SAL NUMBER(5);BEGINSELECT ENAME,SAL INTO V_ENAME,V_SALFROM EMPWHERE EMPNO=P_EMPNO;UPDATE EMPSET SAL=SAL+P_RAISEWHERE EMPNO=P_EMPNO;DBMS_OUTPUT.PUT_LINE('雇员'||V_ENAME||'的工资被改为'||TO_CHAR(V_SAL+P_RAISE));COMMIT;EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('发生错误,修改失败!');ROLLBACK;END;步骤3:调用存储过程,在输入区中输入以下语句并执行:EXECUTE CHANGE_SALARY(7788,80)[说明] 从执行结果可以看到,雇员SCOTT的工资已由原来的3000改为3080。

相关文档
最新文档