存储过程

1.命令格式
  存储过程是一个PL/SQL程序块,接受零个或多个参数作为输入(INPUT)或输出(OUTPUT)、或既作输入又作输出(INOUT),与函数不同, 存储过程没有返回值,存储过程不能由SQL语句直接使用,只能通过EXECUT命令或PL/SQL程序块内部调用,定义存储过程的语法如下:

PROCEDURE Name [(Parameter[,Parameter,])]
IS|AS
  [Local Declarations]
BEGIN
  Execute statements;
  [EXCEPTION Exception Handlers]
END [Name];

2.调用
  存储过程可以直接用EXECUT命令调用或PL/SQL程序块内部调用。用EXECUT命令调用存储过程的格式如下:

SQL>EXCUTE  Proc_Name(par1, par2…);

  存储过程也可以被另外的PL/SQL块调用,调用的语句是:
DECLARE par1, par2;
BEGIN
  Proc_Name(par1, par2…);
END;

3.释放
  当某个存储过程不再需要时,应将其从内存中删除,以释放它占用的内存资源。释放过程的语句格式如下:

SQL>DROP PROCEDURE Proc_Name;

4.实例:
  编写存储过程,显示所指定雇员名所在的部门名和位置。
CREATE OR REPLACE PROCEDURE DeptMesg(pename emp.ename%TYPE,
                                     pdname OUT dept.dname%TYPE,
                                     ploc   OUT dept.loc%TYPE) AS
BEGIN
  SELECT dname, loc
    INTO pdname, ploc
    FROM emp, dept
   WHERE emp.deptno = dept.deptno
     AND emp.ename = pename;
END;

  调用:
VARIABLE vdname VARCHAR2(14);
VARIABLE vloc VARCHAR2(13);
EXECUTE DeptMesg('SMITH', :vdname£¬ :vloc);
PRINT vdname vloc; 

七、函数

1.命令格式
  函数是命名了的、存储在数据库中的PL/SQL程序块。函数接受零个或多个输入参数,有一个返回值,返回值的数据类型在创建函数时定义。定义函数的语法如下:

FUNCTION Name [{Parameter[,Parameter,])]
RETURN DataTypes
IS
[Local Declarations]
BEGIN
  Execute Statements;
  [EXCEPTION Exception Handlers]
END [Name];

2.调用
  无论在命令行还是在程序语句中,函数都可以通过函数名称直接在表达式中调用。例如:将函数Count_Num(‘女’)的返回值赋予变量Man_Num。
SQL>EXECUTE Man_Num := Count_Num('女');

3.释放
  当函数不再使用时,要用DROP命令将其从内存中删除,例如:
SQL>DROP FUNCTION Count_Num;

4.实例
  编写一个函数以显示该雇员在此组织中的工作天数。
CREATE OR REPLACE FUNCTION Hire_Day(no emp.empno%TYPE) RETURN NUMBER AS
  vhiredate emp.hiredate%TYPE;
  vday      NUMBER;
BEGIN
  SELECT hiredate INTO vhiredate FROM emp WHERE empno = no;
  vday := CEIL(SYSDATE - vhiredate);
  RETURN vday;
END;

八、触发器

1.触发器的创建规则:
  ①作用范围清晰;
  ②不要让触发器去完成Oracle后台已经能够完成的功能;
  ③限制触发器代码的行数;
  ④不要创建递归的触发器;
  ⑤触发器仅在被触发语句触发时进行集中的,全局的操作,同用户和数据库应用无关。

2.可以创建被如下语句所触发的触发器:
  ①DML语句(DELETE,INSERT,UPDATE);
  ②DDL语句(CREATE,ALTER, DROP);
  ③数据库操作(SERVERERROR,LOGON,LOGOFF,STARTUP,SHUTDOWN)。

3.注意事项
  ①触发器可以声明为在对记录进行操作之前,在之前(检查约束之前和 INSERT,UPDATE 或 DELETE 执行前)或之后(在检查约束之后和完成 INSERT, UPDATE 或 DELETE 操作)触发;
  ②一个 FOR EACH ROW 执行指定操作的触发器为操作修改的每一行都调用一次;
  ③SELECT 并不更改任何行,因此不能创建 SELECT 触发器.这种场合下规则和视图更适合;
  ④触发器和某一指定的表格有关,当该表格备删除时,任何与该表有关的触发器同样会被删除;
  ⑤在一个表上的每一个动作只能有一个触发器与之关联;
  ⑥在一个单独的表上,最多只能创建三个触发器与之关联,一个INSERT触发器,一个DELETE触发器和一个UPDATE触发器;

4.删除触发器的语句格式为:

DROP TRIGGER name ON table;

  一个触发器由三部分组成:触发事件或语句、触发限制和触发器动作。触发事件或语句是指引起激发触发器的SQL语句,可为对一指定表的INSERT、UNPDATE或DELETE语句。触发限制是指定一个布尔表达式,当触发器激发时该布尔表达式是必须为真。触发器作为过程,是PL/SQL块,当触发语句发出、触发限制计算为真时该过程被执行。

5.实例
  编写一个数据库触发器,当任何时候某个部门从dept表中删除时,该触发器将从emp表中删除该部门的所有雇员。

CREATE OR REPLACE TRIGGER del_emp_deptno
  BEFORE DELETE ON dept
  FOR EACH ROW
BEGIN
  DELETE FROM emp WHERE deptno = :OLD.deptno;
END;

九、包

1.包头
  创建包头的语句格式如下:
  CREATE PACKAGE<包名> IS
    变量、常量及数据类型定义;
    游标定义;
    函数、过程定义和参数列表及返回类型;
  END<包名>;

2.包体
  创建包主体部分的语句格式如下:
  CREATE PACKAGE BODY<包名>
  AS
    游标、函数、过程的具体定义;
  END<包名>;

3.实例

包头代码:
  包体代码:

--创建包头
CREATE PACKAGE test_package IS
  --定义变量
  man_num   NUMBER;
  woman_num NUMBER;
  --定义游标
  CURSOR学生;

--定义函数
  CREATE FUNCTION f_count(in sex IN 学生.sex%TYPE)
  --定义返回值类型
  RETURN NUMBER;

--定义过程
  CREATE PROCEDURE p_count(in_sex IN 学生.sex%TYPE, out_num OUT NUMBER);

--包头结束
END test_package;

--创建包体
CREATE PACKAGE BODY test_package AS
  --游标具体定义
  CURSOR 学生IS
    SELECT 学号,姓名 FROM 学生 WHERE 学号 < 50;

--函数具体定义
  FUNCTION f_count(in_sex IN学生.sex%TYPE)
  --定义返回值类型
   RETURN NUMBER IS
    out_num NUMBER;
    --函数体
  BEGIN
    IF in_sex = '男' THEN
      SELECT count(sex) INTO out_num FROM 学生 WHERE性别='男';
    ELSE
      SELECT count(sex) INTO out_num FROM 学生 WHERE 性别='女';
    END IF;
    --返回函数值
    RETURN(out_num);
    --函数定义结束
  END f_count;

--过程具体定义
  PROCEDURE p_count(in_sex IN学生.sex%TYPE, out_num OUT NUMBER) AS
    --过程体
  BEGIN
    IF in_sex = '男' THEN
      SELECT count(sex) INTO out_num FROM 学生 WHERE性别 = '男';
    ELSE
      SELECT count(sex) INTO out_num FROM 学生 WHERE 性别= '女';
    END IF;
    --过程定义结束
  END P_count;

--包体定义结束
END test_package;

转载于:https://www.cnblogs.com/liaomin416100569/archive/2009/12/07/9332097.html

oracle储存过程与函数相关推荐

  1. SQL SERVER 判断是否存在并删除某个数据库、表、视图、触发器、储存过程、函数

    – SQL SERVER 判断是否存在某个触发器.储存过程 – 判断储存过程,如果存在则删除 IF (EXISTS(SELECT * FROM sysobjects WHERE name='proce ...

  2. oracle =和is,oracle 创建过程、函数中as, is区别 ?

    在过程或函数中, is, as没什么区别,现在一般使用is 测试如下: --is create or replace procedure sp_is_as_test( v_ret out number ...

  3. Oracle 11g_过程、函数、触发器和包(6)

    1.存储过程 存储过程是一种命名的PL/SQL块,它既可以没有参数,也可以有若干参数输入,输出参数,甚至可以有多个既作为输入又作为输出的参数,但它通常没有返回值. 存储过程被保存在数据库中,它不可以被 ...

  4. sqlserver 存储过程 转oracle存储过程,SqlServer存储过程转换成Oracle储存过程语法常见问题...

    1. top order by 转换成 rownum order by 的问题 (子查询实现) 同级情况下的优先处理顺序: sqlserver: 先order by 再top oracle: 先row ...

  5. mysql---存储过程和函数

    mysql从5.0版本开始支持存储过程和函数. 一.什么是存储过程和函数 存储过程和还是你的话简单的说是已经实现编译并存储在数据库中的一段SQL语句的集合,使得一些常用的命令不用每次去手动去写,可以直 ...

  6. MYSQL储存过程和储存函数和变量

    储存过程和储存函数和变量 变量的应用: 变量分类为: 系统变量和自定义变量 系统变量和全局变量还可以细分: 系统变量分类: 全局变量和会话变量 自定义变量分类: 用户变量和局部变量 下面是变量的一些具 ...

  7. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

  8. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  9. oracle实验使用游标,Oracle数据库实验-PLSQL游标、过程、函数、包的使用

    Oracle数据库基础 实验5 PL/SQL游标.过程.函数.包的使用 [实验学时] 2学时 [实验目的] 1.了解PL/SQL语言中显式游标和隐式游标的概念和属性. 2.了解显式游标和隐式游标的差异 ...

  10. oracle dplsql.bsq,Oracle PLSQL语言初级教程之过程和函数

    Oracle PL/SQL语言初级教程之过程和函数 过程和函数 过程和函数都以编译后的形式存放在数据库中,函数可以没有参数也可以有多个参数并有一个返回值.过程有零个或多个参数,没有返回值.函数和过程都 ...

最新文章

  1. jQuery操作CSS
  2. java8 lambda 视频_一文搞懂Java8 Lambda表达式(附带视频教程)
  3. ansible(2)——基本命令
  4. IOS开发基础之异步下载网络图片第1部分
  5. MATLAB的dir函数
  6. 机器学习/深度学习测试题(二)—— 单层线性神经网络求解异或问题
  7. Proxy error: Could not proxy request错误解决
  8. skynet源码分析5:lua绑定之地基
  9. 记录android离屏渲染的一些资料
  10. 数据-第7课-线性表的顺序存储结构
  11. yytext table html,展开label,利用YYText实现文字显示不完末尾添加全文
  12. Eclipse XML 编辑器
  13. 超详细的Python面向对象编程讲解
  14. php点击按钮保存图片到相册,手机端点击下载按钮将页面保存成图片到本地
  15. SQL Server 2005 版本介绍及所谓“企业管理器”问题
  16. weblogic12.1.3applySession在系统修改阶段失败。。。(GDR-70005)
  17. 《上古卷轴5:天际》控制台代码之特技
  18. Scratch 怎么打开SB文件怎么打开
  19. 河北工程技术学院计算机应用技术,2020年春河北工程技术学院期末考试计算机应用基础试题及答案(13页)-原创力文档...
  20. 对AttributeSet和defStyle的理解

热门文章

  1. sprk sql自定义UDF函数
  2. Linux环境下编写C程序
  3. Linux 学习笔记 二
  4. multipathd dead but pid file exists
  5. 单链表的回文判断(O(n)时间复杂度和O(1)的空间复杂度)
  6. lintcode-76-最长上升子序列
  7. RAC性能分析 - gc buffer busy acquire 等待事件
  8. nyoj 19 擅长排列的小明(深搜,next_permutation)
  9. 静态常量static和方法重载
  10. ios客户端快速滚动和回弹效果的实现