存储过程与函数oracle

存储在数据库中供所有用户程序调用的子程序叫做存储过程存储函数。

存储过程是在大型数据库系统中,用PL/SQL语言编写的能完成一定处理功能的存储在数据库字典中的程序,它是一个命名的 PL/SQL 块,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
存储过程的各个部分:
声明部分
可执行部分
异常处理部分(可选)
存储过程的分类:
带参存储过程
不带参存储过程

为保证调用多个存储过程中处在同一个事务中,所以一般不在存储过程或者存储函数中,commit或rollback;

无参存储过程语法带参存储过程带参数存储过程含赋值方式

create or replace procedure NoParPro 

as  //声明 

begin // 执行 

exception//存储过程异常 

end;

create or replace procedure queryempname(sfindno emp.empno%type)  

as 

   sName emp.ename%type; 

   sjob emp.job%type; 

begin 

       .... 

exception 

       .... 

end;

create or replace procedure runbyparmeters   

    (isal in emp.sal%type,  

     sname out varchar

     sjob in out varchar

 as  

    icount number; 

 begin 

      select count(*) into icount from emp where sal>isal and job=sjob; 

      if icount=1 then 

        .... 

      else 

       .... 

     end if; 

exception 

     when too_many_rows then 

     DBMS_OUTPUT.PUT_LINE('返回值多于1行'); 

     when others then 

     DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!'); 

end;

其中参数IN表示输入参数,是参数的默认模式。

OUT表示返回值参数,类型可以使用任意Oracle中的合法类型。

OUT模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程

IN OUT表示该参数可以向该过程中传递值,也可以将某个值传出去。

存储过程参数不带取值范围,in表示传入,out表示输出; 变量带取值范围,后面接分号;

在判断语句前最好先用count(*)函数判断是否存在该条操作记录; 用select … into … 给变量赋值; 在代码中抛异常用 raise+异常名;

调用存储过程的两种方式

1、SQL>exec proc_emp(‘参数1’,’参数2’);//无返回值过程调用

2、SQL>var vsal number

SQL> exec proc_emp (‘参数1’,:vsal);// 有返回值过程调用

或者:call proc_emp (‘参数1’,:vsal);// 有返回值过程调用

begin

            sayHelloWorld();

            sayHelloWorld();

      end;

将过程的

执行权限

授予其他

用户

SQL> GRANT EXECUTE ON find_emp TO MARTIN;

SQL> GRANT EXECUTE ON swap TO PUBLIC;

和函

区别

一般来讲,过程和函数的区别在于函数可以有一个返回值;而过程没有返回值。但过程和函数都可以通过 out 指定一个或多个输出参数。我们可以利用 out 参数,在过程和函数中实现返回多个值

1 如果存储过程想实现有返回值的业务,我们就必须使用out类型的参数。
2 即便是存储过程使用了out类型的参数,起本质也不是真的有了返回值,
3 而是在存储过程内部给out类型参数赋值,在执行完毕后,我们直接拿到输出类型参数的值。

如果只有一个返回值,用存储函数;否则,就用存储过程

过程和函数都可以通过out指定一个或多个输出参数。我们可以利用out参数,在过程和函数中实现返回多个值; 

  • 存储过程和存储函数都可以有out参数;
  • 存储过程和存储函数都可以有多个out参数;
  • 存储过程可以通过out参数来实现返回值。
  • 相同点:1).创建语法结构相似,都可以携带多个传入参数和传出参数。
    2).都是一次编译,多次执行。
    不同点:1).存储过程定义关键字用procedure,函数定义用function。
    2).存储过程中不能用return返回值,但函数中可以,而且函数中必须有return子句。procedur不叫返回值,叫带出,可以带出多个值;
    3).执行方式略有不同,存储过程的执行方式有两种(1.使用execute2.使用begin和end),函数除了存储过程的两种方式外,还可以当做表达式使用,例如放在select中(select f1() form dual;)。
    4).在sql数据操纵语句中只能调用函数而不能调用存储过程,
  • 模块化
    将程序分解为逻辑模块
    可重用性
    可以被任意数目的程序调用
    可维护性
    简化维护操作
    安全性
    通过设置权限,使数据更安全
    提高性能
  • 函数不能独立运行,过程可作为一个独立的PL/SQL语句运行
1.在oracle中,数据表别名不能加as,如:
select a.appname from appinfo a;-- 正确
select a.appname from appinfo as a;-- 错误
2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了。
3.在利用select…into…语法时,必须先确保数据库中有该条记录,否则会报出”no data found”异常。
4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错
5.select sum(vcount) into fcount from A where bid='xxxxxx';
如果A表中不存在bid=”xxxxxx”的记录,则fcount=null(即使fcount定义时设置了默认值,
如:fcount number(8):=0依然无效,fcount还是会变成null),
这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:
if fcount is null then
    fcount:=0;
end if;
触发器
触发器是一种特殊的存储过程,触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。所以触发器常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。 
1、触发器类型
主要有DML触发器、替代触发器、系统事件触发器和DDL触发器。
DML触发器:ORACLE可以在DML语句进行触发,可以在DML操作前(BEFORE触发器)或操作后(AFTER触发器)进行触发,并且可以对每个行或语句操作上进行触发(行级触发器和语句级触发器)。 
INSTEAD OF触发器:又称为替代触发器,用于执行一个替代操作来代替触发事件的操作, 由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。
系统事件触发器:在发生如数据库启动或者关闭等系统事件时触发。
DDL触发器:由DDL语句触发,例如CREATE、ALTER和DROP语句。可分为BEFORE触发器和AFTER触发器。
2、创建触发器
使用CREATE TRIGGER语句,语法如下:
CREATE [ OR REPLACE ] TRIGGER trigger_name
{ BEFORE | AFTER | INSTEAD OF }
{ INSERT | DELETE | UPDATE [ OF column [, column … ] ] }  #tigger_event
[ OR { INSERT | DELETE | UPDATE [OF column [, column … ] ] } ... ]
ON [ schema. ] table_name | [ schema.] view_name | [ DATAASE ]
[ REFERENCING  { OLD [ AS ] old | NEW [ AS ]  new | PARENT as parent } ]
[ FOR EACH ROW ]
[ WHEN trigger_condition ]
[ DECLARE declaration_statements ; ]
BEGIN
trigger_body ;
END [ trigger_name ]
PL/SQL_BLOCK | CALL procedure_name;
语法说明:
trigger_name:触发器名称。
BEFORE | AFTER | INSTEAD OF:BEFORE和AFTER表示触发器执行的时间在触发事件的前后,INSTEAD OF表示触发器中的事件代替触发事件执行。
tigger_event:激活触发器的事件,例如 INSERT、DELETE、UPDATE 。
ON [ schema. ] table_name | [ schema.] view_name | [ DATABASE ]:table_name为DML触发器所针对的表,如果是替代触发器则需要指定视图名称(view_name),如果是DDL触发器或者系统事件触发器,则使用ON DATABASE。
REFERENCING:说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。
FOR EACH ROW:表示是行级触发器,如果未指定则为语句级触发器。
WHEN trigger_condition:为触发的运行指定限制条件。
trigger_body:触发器体,包含触发器的内容。
3、DML触发器
DML触发器由DML语句触发,对应的tigger_event为:
{ INSERT | DELEATE | UPDATE [ OF column [ , ... ] ] }
说明:
DML操作主要包括INSERT、DELETE和UPDATE操作,通过根据针对的事件,可分为INSERT触发器、DELETE触发器和UPDATE触发器。
可以将DML操作细化到列,即针对某列进行DML操作时激活触发器。
任何DML都可按照触发时间分为BEFORE和AFTER。
在行级触发器中,为了获得某列在操作前后的数据,提供两种特殊标识符:OLD和:NEW,通过:OLD.column_name的形式可以获取该列的旧数据,而通过:NEW.colum_name可以获取该列的新数据,INSERT触发器只能用:NEW,DELETE触发器只能用:OLD,UPDATE触发器可以用:OLD和:NEW。
注意:如果创建时,不指定FOR EACH ROW,则为与语句级触发器,所有受影响的数据只处罚一次,因此无法使用:NEW和:OLD获取某列的新旧数据。
4、INSTEAD OF触发器
执行一个替代操作来代替触发事件的操作,而触发事件本身不会被执行。不过oracle中的INSTEAD OF触发器不能针对表,只能针对视图。
5、系统事件触发器
系统事件触发器是指由数据库系统事件触发的触发器,支持的系统事件如下:
系统事件
说明
LOGOFF
用户从数据库注销
LOGON
用户登录数据库
SERVERERROR
服务器发生错误
SHUTDOWN
关闭数据库实例
STARTUP
打开数据库实例
注:对于LOGOFF和SHUTDOWN事件只能创建BEFORE触发器,对于LOGON、SERVERERROR和STARTUP事件只能创建AFTER触发器。
创建系统触发器需要使用ON DATABASE子句,表示创建的触发器是数据库级触发器。创建系统事件触发器需要用户具有DBA权限。
6、DDL触发器
DDL触发器由DDL语句触发,可分为:BEFORE触发器和AFTER触发器,针对事件包含CREATE、ALTER、DROP、ANALYZE、GRANT、COMMENT、REVOKE、RENAME、TRUNCATE、AUDIT、NOTAUDIT、ASSOCIATE STATISTICS和DISASSOCIATE STATISTICS。
创建DDL触发器需要用户具有DBA权限。
7、禁用与启用触发器
创建时使用ENABLE与DISABLE关键字制定触发器初始装填为启用或禁用,默认为ENABLE。需要时也可使用ALTER TRIGGER语句修改触发器的状态,如下:
ALTER TRIGGER trigger_name ENABLE | DISABLE ;
如果修改某个表上所有触发器的状态,可用如下形式:
ALTER TABLE table_name ENABLE | DISABLE ALL TRIGGERS ;
8、修改与删除触发器
修改删除触发器只需要在 CREATE TRIGGER语句中添加OR REPLACE关键字。
删除触发器需要使用DROP TRIGGER语句,具体如下:
DROP TRIGGER trigger_name;

1、创建包
程序包是对相关过程、函数、变量、游标和异常等对象的封装,程序包由规范和主体两部分组成,程序包规范:声明类型、变量、常量、异常、游标和子程序等元素条目(不包含这些元素的实际代码);程序包主体:用于实现在程序包规范中定义的游标、子程序(包含了元素的实际代码)。包规范中的条目为共有项目,可供所有的数据库用户访问;而包体中创建的规范中没有提到的项目,属于私有项目,只能在包体中使用。
1)、创建包规范
创建包规范使用CREATE PACKAGE语句,如下:
CREATE [ OR REPLACE ] PACKAGE package_name
{ IS | AS }
package_specification ;
END package_name;
说明:
package_name:创建的包名
package_specification:用于列出用户可以使用的公共存储过程、函数、类型和对象。
2)、创建包体
创建包体需要使用CREATE PACKAGE BODY语句,并且在创建的时候需要指定已创建的包,如下:
CREATE [ OR REPLACE ] PACKAGE BOODY package_name
{ IS | AS }
package_body ;
END package_name ;
2、调用包
调用程序包中的元素时,采用如下形式:
package_name.[ element_name ] ;
element_name:表示元素名称,可以使存储过程名、函数名、变量名和常量名等。
注:程序包中可以定义公有常量和变量,使用的DBMS_OUTPUT.PUT_LINE输出结果语句,DBMS_OUTPUT是系统定义的包,PUT_LINE是该包的存储过程。
3、删除包
使用DEOP PACKAGE语句,如果程序包被删除,则包体也被自动删除。如下:
DROP PACKAGE package_name ;
 
 
 
 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统学习SpringFramework:Spring IOC

本篇内容包括:IOC 和 DI 的概念、Spring 容器,即 BenaFactory 与 AplicationConext 等 IOC 相关内容。 一、IOC 和 DI 的概念 1、IOC IoC(Inversion of control )即“控制反转”,它是一种设计思想而非一个技术实现。…

彻底卸载oracle

linux删除Oracle安装目录下的所有文件和文件夹即可。windows 1.关闭oracle所有的服务。可以在windows的服务管理器中关闭 2.打开注册表:regedit 打开路径: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ 删除该路径下的所有以oracle开始的服务…

系统学习SpringFramework:Spring AOP

本篇内容包括:Spring AOP 概述(AOP 简介、AOP 为什么叫面向切面编程、AOP 主要用来解决的问题 和 AOP 的相关术语)、Spring AOP Demo(xml 方式、注解方式)以及相关知识点(JDK 动态代理和 CGLIB 代理、Sprin…

rowid

ROWID的格式rowidOOOOOOFFFBBBBBBRRR说明数据对象号相对文件号数据块号行号 上述表格是Oracle 9i及以上版本数据库中的rowid格式: 6位对象号3位相对文件号6位数据块号3位行号,是一个18位的64进制值。这个18位的64进制值在数据库内却是以10个bytes合计80个bit的二进制…

git和gitlab安装

1.下载git最新包 https://mirrors.edge.kernel.org/pub/software/scm/git/ 将最新包上传至服务器/home目录 tar -Jxvf 解压 进入git目录 ./configure --prefix/usr/local/git make make install 错误解决:Cant locate ExtUtils/MakeMaker.pm in INC yum i…

系统学习SpringFramework:循环依赖与三级缓存

本篇内容包括:Spring 中的循环依赖问题(包括 Spring 中的循环依赖问题和Spring 中的循环依赖的 5 种场景的介绍)、Spring 三级缓存介绍、4 个 Spring 无法自动解决的循环以来场景以及其对应的手动解决方式。 一、Spring 中的循环依赖问题 1、…

oracle安装需要的包列表

redhat7.5安装图形界面: [rootwwyt ~]# rpm -ivh --nodeps --force xorg-x11-font* [rootwwyt ~]# mount -o loop -t iso9660 rhel-server-7.5-x86_64-dvd.iso /media/iso/ [rootwwyt ~]# cat /etc/yum.repos.d/my.repo [base] nameredhat7.5 baseurlfile:///m…

深入理解Java虚拟机:Java类的加载机制

本篇内容包括:Java 类的加载机制(Jvm 结构组成、Java 类的加载)、类的生命周期(加载-验证-准备-解析-初始化-使用-卸载)、类加载器 以及 双亲委派模型。 一、Java 类的加载机制 1、 Jvm 结构组成 Jvm 整体组成可分为…

新版谷歌浏览器开启Flash支持

浏览器地址栏中输入chrome://version查看Chrome浏览器、Flash插件的版本信息。 Chrome 69.0-70.0版本Chrome 71.0-74.0及以后版本谷歌浏览器地址栏中输入【chrome://flags/#enable-ephemeral-flash-permission】,将【Enable Ephemeral Flash Permissions】从【Defau…

深入理解Java虚拟机:Java垃圾回收机制

本篇内容包括:JAVA 垃圾回收机制概述、有哪些内存需要回收、如何回收(标记-清除、标记-整理(标记-清除-压缩)、复制(标记-复制-清除)、分代收集等算法) 以及 何时进行垃圾回收等内容&#xff01…

深入理解Java虚拟机:Java垃圾回收器

本篇内容包括:7 种 Jvm 垃圾回收器的介绍、对比 以及 对应的 Jvm 参数设置,这 7 种包括了:Serial、ParNew 以及 Parallel Scavenge 三种新生代回收器 和 :Serial Old、Parallel Old 以及 CMS 三种老年代回收器,此外还有…

oracle跨越千年处理

如果指定的两位年份0-4950-99 如果当前 的两位年 份是 0-49返回的日期是当前世纪返回的日期是上个世纪50-99返回的日期是下个世纪返回的日期是当前世纪 current yearSpecified DateRR FormatYY Format199527-OCT-9519951995199527-OCT-171951917200127-OCT-1720012017200127-OC…

网络协议:什么是网络分层的七四五

本篇内容包括:网络分层七层、五层、四层网络协议概念的介绍,IOS 体系结构的介绍与构成、TCP/IP体系结构的简介及与IOS体系的关系 以及五层体系结构的介绍。 一、七层、五层、四层网络协议概念 1、关于网络协议 网络协议,即是指计算机网络中…

查看表空间相关命令

默认表空间数据文件大小根据DATA BLOCKS的大小有关,默认最大为32GB表空间达到32G,只能增加数据文件alter tablespace 表空间名 add datafile 数据文件路径‘ size 500m autoextend on next 100m maxsize 10000M;未达到32G,修改数据文件的扩展…

网络协议:一文搞懂Socket套接字

本篇内容包括:Socket 套接字的简介、Socket 套接字的分类、Java 中的 Socket 即 java.net.ServerSocket、java.net.Socket 的使用,以及Java 使用套接字 Scoket 编程的Demo。 一、Socket 简介 TCP(传输控制协议)是一种面向连接的、…

RESETLOGS

使用resetlogs选项,会把当前的日志序号(log sequence number)重设为1,并抛弃所有日志信息。在以下条件时需要使用resetlogs选项: 在不完全恢复(介质恢复); 使用备份控制文件。 使…

网络协议:透彻解析HTTP协议

本篇内容包括:HTTP 协议定义及其特点概述、关于 URL 定义及分类概述、Request 请求、Response 响应 以及 浏览器访问一个网站的全过程 等内容… 一、HTTP 协议概述 HTTP(HyperText Transfer Protocol) 即 超文本传输协议,它是一种…

oracle参数文件和口令文件

外部 审核 口令:记录超级用户的用户名和口令,做sys用户的安全审核 oracle9以后全部使用sys登录,但需要使用as sysdba ,之前版本需要使用internal o7字典打开 只要用户和密码存在于口令文件,就可以以sysdba登录&#…

innobackup备份恢复实操步骤--gtid复制(1)(1)

首先在主库进行备份: 备份命令: Innobackupex --defaults-file/app/dbcluster/sgrdb/mysql/my19103.cnf --no-timestamp --userdbscale --passwordS6000dbscale --host10.157.43.224 --port19103 /data/backup 如果使用setsid: setsid …