Oracle数据库操作处理笔记(3)

本文详细介绍了Oracle数据库中的存储过程和函数的使用,包括它们的存储、安全性、调用方式以及参数传递。通过实例展示了如何创建、编译、删除和调用存储过程和函数,还探讨了存储过程和函数的优缺点。此外,还提到了包的概念,讨论了包在组织和管理存储过程中的作用以及包的创建和使用方法。
摘要由CSDN通过智能技术生成

一、存储过程/job/函数/触发器操作
1、存储过程和函数
存储过程和函数也是一种 pl/sql块,是存入数据库的 pl/sql块。但存储过程和函数不同于已经介绍过的 pl/sql程序,我们通常把 pl/sql程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的。和 pl/sql程序相比,存储过程有很多优点,具体归
纳如下:
a)存储过程和函数以命名的数据库对象形式存储于数据库当中。存储在数据库中的优点是很明显的,因为代码不保存在本地,用户可以在任何客户机上登录到数据库,并调用或修改代码。
b)存储过程和函数可由数据库提供安全保证,要想使用存储过程和函数,需要有存储过程和函数的所有者的授权,只有被授权的用户或创建者本身才能执行存储过程或调用函数。
c)存储过程和函数的信息是写入数据字典的,所以存储过程可以看作是一个公用模块,用户编写的 pl/sql程序或其他存储过程都可以调用它(但存储过程和函数不能调用 pl/sql程序)。一个重复使用的功能,可以设计成为存储过程,比如:显示一张工资统计表,可以设计成为存储过程;一个经常调用的计算,可以设计成为存储函数;根据雇员编号返回雇员的姓名,可以设计成存储函数。
d)像其他高级语言的过程和函数一样,可以传递参数给存储过程或函数,参数的传递也有多种方式。存储过程可以有返回值,也可以没有返回值,存储过程的返回值必须通过参数带回;函数有一定的数据类型,像其他的标准函数一样,我们可以通过对函数名的调用返回函数值。
存储过程和函数需要进行编译,以排除语法错误,只有编译通过才能调用。
创建存储过程,需要有 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,后跟过程的说明部分,可以在此定义过程的局部变量,编写存储过程可以使用任何文本编辑器或直接在 sqlplus环境下进行,编写好的存储过程必须要在 sqlplus环境下进行编译,生成编译代码,原代码和编译代码在编译过程中都会被存入数据库。编译成功的存储过程就可以在 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 dyk_count
as
v_total1 number(10);
v_total2 number(10);
v_total3 number(10);
begin
select count(*) into v_total1 from dyk_table1;
dbms_output.put_line('雇员总人数为:'||v_total1);
delete dyk_table1 where owner In ('XDB','CTSSYS','OUTLN','WMSYS');
select count(*) into v_total2 from dyk_table1;
dbms_output.put_line('剩余总人数为:'||v_total2);
insert into dyk_table1 nologging select * from dba_objects;
select count(*) into v_total3 from dyk_table1;
dbms_output.put_line('增加后的总人数为:'||v_total3);
end;

步骤 3:按“执行”按钮进行编译。
如果存在错误,就会显示:警告:创建的过程带有编译错误。
如果存在错误,对脚本进行修改,直到没有错误产生。
如果编译结果正确,将显示:(sql代码)
过程已创建。
步骤 4:调用存储过程,在输入区中输入以下语句并执行:
sql代码

set serverout on  /从 sql提示符下输出存储过程变量值
execute dyk_count;
显示结果为:
雇员总人数为:337386
剩余总人数为:336456
增加后的总人数为:386254

说明:在该训练中,v_total变量是存储过程定义的局部变量,用于接收查询到的雇员总人数。
注意:在 sql*plus中输入存储过程,按“执行”按钮是进行编译,不是执行存储过程。如果在存储过程中引用了其他用户的对象,比如表,则必须有其他用户授予的对象访问权限。一个存储过程一旦编译成功,就可以由其他用户或程序来引用。但存储过程或函数的所有者必须授予其他用户执行该过程的权限。
存储过程没有参数,在调用时,直接写过程名即可。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A Master

您的鼓励是对我最大的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值