网站首页 > 技术文章 正文
存储过程就是一条或者多条SQL语句的集合,可视为批文件,但是其作用不仅限于批处理。
1.创建存储过程
存储过程是指在Oracle数据库中,一组为了完成特定功能的 SQL 语句集,存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
在数据转换或查询报表时经常使用存储过程,它的作用是SQL语句不可替代的。
相对于直接使用SQL语句,在应用程序中直接调用存储过程有以下好处:
①减少网络通信量。调用一个行数不多的存储过程与直接调用SQL语句的网络通信量 可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条地调用SQL语句要高得多。
②执行速度更快。有两个原因:首先,在存储过程创建的时候,数据库已经对其进行 了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。
③更强的适应性。由于存储过程对数据库的访问是通过存储过程接口来进行的,因此 数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。
④分布式工作。应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。
创建存储过程,需要使用CREATEPROCEDURE语句,基本语法格式如下:
CREATE [OR REPLACE] PROCEDURE [schema.] procedure_name
[parameter_name [[IN]datatype[{:=DEFAULT}expression]]
{IS|AS}
BODY:
-------------分割线---------
CREATE PROCEDURE procedure_name
IS
BEGIN
-- 存储过程的代码逻辑
END;
- CREATE PROCEDURE为用来创建存储函数的关键字;
- OR REPLACE表示如果指定的过程已经存在,则覆盖同名的存储过程;
- schema表示该存储过程的所属机构;
- procedure_name为存储过程的名称;
- parameter_name为存储过程的参数名称;
- [IN]datatype[{:=DEFAULT}expression]设置传入参数的数据类型和默认值;
- {IS]AS}表示存储过程的连接词;
- BODY:表示函数体,是存储过程的具体操作部分,可以用BEGIN.….END来表示SQL代码的开始和结束。
--存储过程名为HELLO
CREATE PROCEDURE HELLO
AS
BEGIN
--存储过程体仅输出一行字符串
dbms_output.put_line('您好,这是一个简单的存储过程');
END;
2.调用存储过程
直接调用存储过程的方法如下:
execute procedure_name;
也可以缩写成如下:
exec procedure_name;
在Oracle SQL Developer中调用存储过程,如果想让DBMS_OUTPUT.PUT_LINE成功输出,需要把SERVEROUTPUT选项设置为ON状态。默认情况下,它是OFF状态。
可以使用以下语句查看 SERVEROUTPUT 选项的状态:
SHOW SERVEROUTPUT
--如果是OFF状态,则显示以下信息:
SERVEROUTPUT OFF
--设置为ON状态的语句如下:
SET SERVEROUTPUT ON
在Oracle SQL Developer中运行下面的代码调用存储过程HELLO:
exec HELLO;
运行结果如下:
您好,这是一个简单的存储过程
另外,也可以在BEGIN....END中直接调用存储过程,调用语法如下:
BEGIN
procedure_name;
END;
3.查看存储过程
Oracle存储了存储过程的状态信息,用户可以查看已经存在的存储过程,还可以到视图USER_SOURCE中查看。
查看HELLO存储过程的SQL语句如下:
SELECT * FROM USER_SOURCE WHERE NAME='HELLO' ORDER BY LINE;
注意:在查看存储过程中,需要把存储过程的名称大写,如果小写,则无法查询到任何内容。如果想查看所有的存储过程,可以在ALLSOURCE视图中查询。
4.存储过程的参数
存储过程可以带参数,也可以不带参数。在数据转换时经常使用不带参数的存储过程。
4.1无参数的存储过程
在Oracle中,存储过程是一段预先编译好的可重复使用的PL/SQL代码块。存储过程可以接受参数,也可以不接受参数。
CREATE PROCEDURE procedure_name
IS
BEGIN
-- 存储过程的代码逻辑
END;
4.2 有参数的存储过程
存储过程可以带有参数,使用参数可以增加存储过程的灵活性,为数据库编程带来很大的便利。存储过程的参数可以是常量、变量和表达式等。一旦为存储过程使用了参数,在执行存储过程时,必须指定对应的参数。
create [or replace] procedure 存储名 [(参数列表)] is|as
声明变量语句段 ;
begin
执行语句段 ;
[Exception
异常处理语句段 ;]
end 过程名;
5.修改存储过程
在Oracle中,如果要修改存储过程,使用CREATE OR REPLACE PROCEDURE语句,也就是覆盖原始的存储过程。
修改存储过程HELLO,代码如下:
CREATE OR REPLACE PROCEDURE HELLO
AS
BEGIN
DBMS_OUTPUT.PUT_LINE('这是修改后的存储过程');
END;
6.删除存储过程
删除存储过程,可以使用DROP语句,其语法结构如下:
DROP PROCEDURE [schema.] procedure_name
Schema 表示存储过程所属的机构;procedure_name为要移除的存储过程的名称。
删除存储过程HELLO,代码如下:
DROP PROCEDURE HELLO;
7.查看存储过程的错误
编写的存储过程难免会出现各种错误而导致编译失败,为了减少排查错误的范围,Oracle提供了查看存储过程错误的方法,语法结构如下:
SHOW ERRORS PROCEDURE procedure_name;
创建一个有错误的存储过程:SQL语句如下:
CREATE OR REPLACE PROCEDURE HELLO
AS
BEGIN
DBMM_OUTPUT.PUT_LINE('这是有错误的存储过程');
END;
查看错误的具体细节,代码如下:
SHOW ERRORS PROCEDURE HELLO;
结果如下:
从错误提示可以看出来,错误出现在第4行,正确的写法如下:
DBMS_OUTPUT.PUT_LINE('这是有错误的存储过程');
猜你喜欢
- 2024-10-23 面试官:说说你对Oracle聚簇Cluster(B树聚簇)的一些看法?
- 2024-10-23 oracle数据库学习笔记 oracle数据库基础教程
- 2024-10-23 珍藏的ORACLE 体系结构详细图——逻辑结构+物理结构
- 2024-10-23 细说Oracle数据库与操作系统存储管理二三事
- 2024-10-23 【赵强老师】Oracle存储过程中的out参数
- 2024-10-23 oracle中怎么创建存储过程 oracle 创建存储过程,及调用
- 2024-10-23 从Oracle的SQL管理能力,看国产数据库差距
- 2024-10-23 Oracle存储过程模板 oracle存储过程视频教程
- 2024-10-23 Oracle学习笔记-存储过程与存储函数
- 2024-10-23 Oracle究竟有没有过时? oracle现在怎么样
你 发表评论:
欢迎- 552℃Oracle分析函数之Lag和Lead()使用
- 546℃几个Oracle空值处理函数 oracle处理null值的函数
- 543℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 537℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 534℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 522℃【数据统计分析】详解Oracle分组函数之CUBE
- 509℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 498℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端排序 (47)
- 前端密码加密 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)