百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

从零开始学习Oracle之存储过程(oracle存储过程入门)

sinye56 2024-10-09 19:38 6 浏览 0 评论

存储过程就是一条或者多条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('这是有错误的存储过程');

相关推荐

Linux基础知识之修改root用户密码

现象:Linux修改密码出现:Authenticationtokenmanipulationerror。故障解决办法:进入单用户,执行pwconv,再执行passwdroot。...

Linux如何修改远程访问端口

对于Linux服务器而言,其默认的远程访问端口为22。但是,出于安全方面的考虑,一般都会修改该端口。下面我来简答介绍一下如何修改Linux服务器默认的远程访问端口。对于默认端口而言,其相关的配置位于/...

如何批量更改文件的权限

如果你发觉一个目录结构下的大量文件权限(读、写、可执行)很乱时,可以执行以下两个命令批量修正:批量修改文件夹的权限chmod755-Rdir_name批量修改文件的权限finddir_nam...

CentOS「linux」学习笔记10:修改文件和目录权限

?linux基础操作:主要介绍了修改文件和目录的权限及chown和chgrp高级用法6.chmod修改权限1:字母方式[修改文件或目录的权限]u代表所属者,g代表所属组,o代表其他组的用户,a代表所有...

Linux下更改串口的权限

问题描述我在Ubuntu中使用ArduinoIDE,并且遇到串口问题。它过去一直有效,但由于可能不必要的原因,我觉得有必要将一些文件的所有权从root所有权更改为我的用户所有权。...

Linux chown命令:修改文件和目录的所有者和所属组

chown命令,可以认为是"changeowner"的缩写,主要用于修改文件(或目录)的所有者,除此之外,这个命令也可以修改文件(或目录)的所属组。当只需要修改所有者时,可使用...

chmod修改文件夹及子目录权限的方法

chmod修改文件夹及子目录权限的方法打开终端进入你需要修改的目录然后执行下面这条命令chmod777*-R全部子目录及文件权限改为777查看linux文件的权限:ls-l文件名称查看li...

Android 修改隐藏设置项权限

在Android系统中,修改某些隐藏设置项或权限通常涉及到系统级别的操作,尤其是针对非标准的、未在常规用户界面显示的高级选项。这些隐藏设置往往与隐私保护、安全相关的特殊功能有关,或者涉及开发者选项、权...

完蛋了!我不小心把Linux所有的文件权限修改了!在线等修复!

最近一个客户在群里说他一不小心把某台业务服务器的根目录权限给改了,本来想修改当前目录,结果执行成了根目录。...

linux改变安全性设置-改变所属关系

CentOS7.3学习笔记总结(五十八)-改变安全性设置-改变所属关系在以前的文章里,我介绍过linux文件权限,感兴趣的朋友可以关注我,阅读一下这篇文章。这里我们不在做过的介绍,注重介绍改变文件或者...

Python基础到实战一飞冲天(一)--linux基础(七)修改权限chmod

#07_Python基础到实战一飞冲天(一)--linux基础(七)--修改权限chmod-root-groupadd-groupdel-chgrp-username-passwd...

linux更改用户权限为root权限方法大全

背景在使用linux系统时,经常会遇到需要修改用户权限为root权限。通过修改用户所属群组groupid为root,此操作只能使普通用户实现享有部分root权限,普通用户仍不能像root用户一样享有超...

怎么用ip命令在linux中添加路由表项?

在Linux中添加路由表项,可以使用ip命令的route子命令。添加路由表项的基本语法如下:sudoiprouteadd<network>via<gateway>这...

Linux配置网络

1、网卡名配置相关文件回到顶部网卡名命名规则文件:/etc/udev/rules.d/70-persistent-net.rules#PCIdevice0x8086:0x100f(e1000)...

Linux系列---网络配置文件

1.网卡配置文件在/etc/sysconfig/network-scripts/下:[root@oldboynetwork-scripts]#ls/etc/sysconfig/network-s...

取消回复欢迎 发表评论: