系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 数据库 > oracle > 详细页面

oracle 存储过程、函数和触发器用法实例详解

时间:2020-02-20来源:系统城作者:电脑系统城

本文实例讲述了oracle 存储过程、函数和触发器用法。分享给大家供大家参考,具体如下:

一、存储过程和存储函数

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

创建存储过程

用CREATE PROCEDURE命令建立存储过程。

语法:


 
  1. create [or replace] procedure 过程名(参数列表)
  2. as
  3. PLSQL子程序体;

 
  1. --给指定员工涨工资
  2. create procedure addSal(empid in number)
  3. as
  4. psal emp.sal%type;
  5. begin
  6. select sal into psal from emp where empno=empid;
  7. update emp set sal = sal * 1.1 where empno=empid;
  8. dbms_output.put_line(empid || '涨工资前' || psal || '涨工资后' || (psal * 1.1));
  9. end;
  10.  

调用存储过程


 
  1. --方法一
  2. begin
  3. addSal(7369);
  4. end;
  5. --方法二
  6. exec addSal(7369);
  7.  

存储函数

函数为一命名的存储程序,可带参数,并返回一计算值。函数和过程的结构类似,但必须有一个return子句,用于返回函数值。函数说明要指定函数名,结果值的类型,以及参数类型等。
创建语法:


 
  1. CREATE [OR REPLACE] FUNCTION 函数名 (参数列表)
  2. RETURN 函数值类型
  3. AS
  4. PLSQL子程序体;
  5.  

 
  1. --查询指定员工的年收入
  2. create function queryEmpSal(empid in number)
  3. return number
  4. as
  5. psal emp.sal%type;
  6. pcomm emp.comm%type;
  7. begin
  8. select sal,comm into psal,pcomm from emp where empno=empid;
  9. return (psal*12) + nvl(pcomm,0);
  10. end;
  11.  

函数的调用


 
  1. declare
  2. psal number;
  3. begin
  4. psal:=queryEmpSal(7369);
  5. dbms_output.put_line(psal);
  6. end;
  7.  


 
  1. begin
  2. dbms_output.put_line(queryEmpSal(7369));
  3. end;
  4.  

过程和函数中的IN和OUT

一般来讲,过程和函数的区别在于函数可以有一个返回值,而过程没有返回值。
但过程和函数都可以通过out指定一个或多个输出参数。我们可以利用out参数,在过程和函数中实现返回多个值。
什么时候用存储过程或函数?
原则:如果只有一个返回值,用存储函数,否则,就用存储过程。

创建包和包体

什么是包和包体?
包是一组相关过程、函数、变量、常量、类型和游标等PL/SQL程序设计元素的组合。包具有面向对象设计的特点,是对这些PL/SQL程序设计元素的封装。
包体是包定义部分的具体实现。
包由两个部分组成:包定义和包主体。


 
  1. --包定义
  2. create [or replace] package 包名 as
  3. [公有数据类型定义]
  4. [公有游标声明]
  5. [公有变量、常量声明]
  6. [公有子程序声明]
  7. end 包名;
  8.  

 
  1. --包主体
  2. create [or replace] package body 包名 as
  3. [私有数据类型定义]
  4. [私有变量、常量声明]
  5. [私有子程序声明和定义]
  6. [公有子程序定义]
  7. begin
  8. PL/SQL子程序体;
  9. end 包名;
  10.  

 
  1. --创建mypackage包
  2. create or replace package mypackage as
  3. procedure total(num1 in number, num2 in number, num3 out number);
  4. end mypackage;
  5.  

 
  1. --mypackage包体
  2. create or replace package body mypackage as
  3. --计算累加和的total过程
  4. procedure total(num1 in number, num2 in number, num3 out number) as
  5. tmp number := num1;
  6. begin
  7. if num2 < num1 then num3 := 0;
  8. else num3 := tmp;
  9. loop
  10. exit when tmp > num2;
  11. tmp := tmp + 1;
  12. num3 := num3 + tmp;
  13. end loop;
  14. end if;
  15. end total;
  16.  
  17. end mypackage;
  18.  

(*注意:包定义和包体要分开创建)
调用包


 
  1. declare
  2. num1 number;
  3. begin
  4. mypackage.total(1, 5, num1);
  5. dbms_output.put_line(num1);
  6. end;
  7.  

更多关于Oracle相关内容感兴趣的读者可查看本站专题:《Oracle常用函数汇总》、《Oracle日期与时间操作技巧总结》及《php+Oracle数据库程序设计技巧总结》

希望本文所述对大家Oracle数据库程序设计有所帮助。

分享到:

相关信息

  • sql in查询元素超过1000条的解决方案

    1、方案一:核心思路是,将集合拆分,使用or 连接。 2、方案二:用子查询(临时表)+关联查询...

    2023-03-06

  • Navicat设置Oracle数据库主键自增的方法步骤

    天工作的时候,用到了oracle数据库建表,发现navicat中对于oracle的支持没有那个主键自增的按钮,下面这篇文章主要给大家介绍了关于Navicat设置Oracle数据库主键自增的方法步骤,需要的朋友可以参考下...

    2023-03-06

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载