Oracle中 关于数据库存储过程和存储函数的使用

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

创建存储过程
      用CREATE PROCEDURE命令建立存储过程和存储函数。

语法:
create [or replace] PROCEDURE过程名(参数列表)
AS
        PLSQL子程序体;

存储过程示例:为指定的职工在原工资的基础上长10%的工资
 
/*
为指定的职工在原工资的基础上长10%的工资,并打印工资前和工资后的工资
*/
SQL> create or replace procedure raiseSalary(empid in number)
    as
    pSal emp.sal%type;--保存员工当前 工资
    begin
--查询该员工的工资
    select sal into pSal from emp where empno=empid;
--给该员工涨工资
    update emp set sal = sal*1.1 where empno=empid;
--打印涨工资前后的工资
    dbms_output.put_line('员工号:' || empid || '涨工资前
   ' || psal || '涨工资后' || psal*1.1);
    end;
 1  /

Procedure created
--存储过程调用
--方法一
SQL> set serveroutput on
SQL> exec raisesalary(7369);

员工号:7369涨工资前
800涨工资后880

方法二
    set serveroutput on
begin
 raisesalary(7369);
end;
/

PL/SQL procedure successfully completed

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

建立存储函数的语法:

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

示例:查询某职工的年收入。
SQL> /**/
    /*
    查询某职工的总收入
    */
    create or replace function queryEmpSalary(empid in number)
    return number
   as
    pSal number; --定义变量保存员工的工资
    pComm number; --定义变量保存员工的奖金
   begin
   select sal,comm into psal,pcomm from emp where empno = empid;
   return psal*12+nvl(pcomm,0);
   end;
   /

Function created

l   函数的调用

SQL> declare
    v_sal number;
    begin
    v_sal:=queryEmpSalary(7934);
    dbms_output.put_line('salary is:'|| v_sal);
    end;
    /

salary is:15600

PL/SQL procedure successfully completed

SQL> begin
    dbms_output.put_line('salary is:'|| queryEmpSalary(7934));
    end;
    /

salary is:15600

PL/SQL procedure successfully completed

触发器
       数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。

触发器的类型
         语句级触发器
        在指定的操作语句操作之前或之后执行一次,不管这条语句影响了多少行。

行级触发器(FOR EACH ROW)
        触发语句作用的每一条记录都被触发。在行级触发器中使用old和new伪记录变量,识别值的状态。

创建触发器
CREATE  [or REPLACE] TRIGGER 触发器名
   {BEFORE | AFTER}
   {DELETE | INSERT | UPDATE [OF列名]}
   ON  表名
   [FOR EACH ROW [WHEN(条件) ] ]
   PLSQL 块

示例1:限制非工作时间向数据库插入数据
SQL> create or replace
    trigger securityEmp
    before insert on emp
    declare
    begin
    if to_char(sysdate,'day')in('星期四','星期六','星期日')
    or to_number(to_char(sysdate,'hh24'))not between 8 and 18 then
    raise_application_error(-20001,'不能在非工作时间插入数据。');
    end if;
   end;
   /

Trigger created

触发语句与伪记录变量的值



















触发语句

:old

:new

Insert

所有字段都是空(null)

将要插入的数据

Update

更新以前该行的值

更新后的值

delete

删除以前该行的值

所有字段都是空(null)

示例2:确认数据(检查emp表中sal的修改值不低于原值)
SQL> create or replace trigger checkSal
    before update of sal on emp
    for each row
    declare
    begin
    if :new.sal<:old.sal then
    raise_application_error(-20001,'更新后的薪水比更新前小');
    end if;
    end;
   /

Trigger created
运行后结果:
SQL> update emp set sal=260 where empno=7499;

update emp set sal=260 where empno=7499

ORA-20001: 更新后的薪水比更新前小
ORA-06512: 在 "SCOTT.CHECKSAL", line 4
ORA-04088: 触发器 'SCOTT.CHECKSAL'执行过程中出错

触发器总结
      触发器可用于
•         数据确认
•         实施复杂的安全性检查
•         做审计,跟踪表上所做的数据操作等

查询触发器、过程及函数
•         Select * from user_triggers;
•         Select * from user_source;

(0)

相关推荐

  • Oracle存储过程和存储函数创建方法(详解)

    select * from emp; -----------------存储过程------------------------ --定义 create[or replace] procedure 存储过程名称(参数名 [in]/out 数据类型)    is/as    begin --逻辑表达式  end [存储过程名称]; --定义存储过程计算年薪,并答应输出 create or replace procedure proc_salyears(v_no in number)    is  

  • oracle中存储函数与存储过程的区别介绍

    在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,可是也有它们的不同之处,这段时间刚学完函数与存储过程,来给自己做一个总结: 一:存储过程:简单来说就是有名字的pl/sql块. 语法结构: create or replace 存储过程名(参数列表) is --定义变量 begin --pl/sql end; 案例: create or replace procedure add_(a int,b int) is c int; begin c:=a+b; dbms_ou

  • Oracle中 关于数据库存储过程和存储函数的使用

    存储过程和存储函数指存储在数据库中供所有用户程序调用的子程序叫存储过程.存储函数.存储过程没有返回值.存储函数有返回值 创建存储过程      用CREATE PROCEDURE命令建立存储过程和存储函数. 语法:create [or replace] PROCEDURE过程名(参数列表) AS         PLSQL子程序体: 存储过程示例:为指定的职工在原工资的基础上长10%的工资 /*为指定的职工在原工资的基础上长10%的工资,并打印工资前和工资后的工资*/SQL> create or

  • Oracle中的INSTR,NVL和SUBSTR函数的用法详解

    Oracle中INSTR的用法: INSTR方法的格式为 INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号) 返回找到的位置,如果找不到则返回0. 例如:INSTR('CORPORATE FLOOR','OR', 3, 2)中,源字符串为'CORPORATE FLOOR', 在字符串中查找'OR',从第三个字符位置开始查找"OR",取第三个字后第2个匹配项的位置. 默认查找顺序为从左到右.当起始位置为负数的时候,从右边开始查找. 所以SELECT I

  • 细谈Mysql的存储过程和存储函数

    1 存储过程 1.1 什么是存储过程 存储过程是一组为了完成某项特定功能的sql语句集,其实质上就是一段存储在数据库中的代码,他可以由声明式的sql语句(如CREATE,UPDATE,SELECT等语句)和过程式sql语句(如IF...THEN...ELSE控制结构语句)组成.存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用. 1.2 存储过程的优缺点 优点: 1.可增强sql语言的功能和灵活性 存储过程可以用流程控制语言编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算.

  • MyBatis如何调用存储过程与存储函数

    目录 1.MyBatis调用存储过程 2.MyBatis调用存储函数 1.MyBatis调用存储过程 MyBatis支持使用存储过程的配置.当使用存储过程时,需要设置一个参数"mode",其值有IN(输入参数).OUT(输出参数)和INOUT(输入/输出参数). MyBatis定义存储过程如下: <!-- 存储过程 --> <select id="selectSomeThing" statementType="CALLABLE"

  • Oracle中命名块之存储过程的详解及使用方法

    一.匿名块和命名块 ◆PL/SQL块分为良好总:命名块和匿名块. ◆匿名块:以declare或begin开始,每次执行匿名块都要通过客户端工具将其发送给Oracle,经过语法分析.编译然后执行. ◆命名块:具有名称的PL/SQL块,这些命名块被存储在Oracle中,编译一次,以后只可调用就可多次执行.如:存储过程.存储函数.包.触发器等. 存储过程:无返回值;   存储函数:有返回值;   包:可容纳多个过程或函数的一个容器(较好管理这些过程和函数,类似于java中的包);   触发器:在合适的

  • Oracle存储过程和自定义函数详解

    概述 PL/SQL中的过程和函数(通常称为子程序)是PL/SQL块的一种特殊的类型,这种类型的子程序可以以编译的形式存放在数据库中,并为后续的程序块调用. 相同点: 完成特定功能的程序 不同点:是否用return语句返回值. 举个例子: create or replace procedure PrintStudents(p_staffName in xgj_test.username%type) as cursor c_testData is select t.sal, t.comm from

  • 详解MySQL中存储函数创建与触发器设置

    目录 1.创建存储函数 2.调用存储函数 3.创建触发器 4.在触发器中调用存储过程 5.删除触发器 存储函数也是过程式对象之一,与存储过程相似.他们都是由SQL和过程式语句组成的代码片段,并且可以从应用程序和SQL中调用.然而,他们也有一些区别: 1.存储函数没有输出参数,因为存储函数本身就是输出参数. 2.不能用CALL语句来调用存储函数. 3.存储函数必须包含一条RETURN语句,而这条特殊的SQL语句不允许包含于存储过程中 1.创建存储函数 使用CREATE FUNCTION语句创建存储

  • MySQL的存储函数与存储过程相关概念与具体实例详解

    目录 MySQL存储过程与存储函数的相关概念 存储过程 存储函数 存储函数与存储过程的对比 存储过程和函数的查看修改删除 MySQL存储过程与存储函数的相关概念 存储函数和存储过程的主要区别: 存储函数一定会有返回值的 存储过程不一定有返回值 存储过程和函数能后将复杂的SQL逻辑封装在一起,应用程序无需关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可 存储过程 一组预先编译的SQL语句的封装 执行过程:执行过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要

随机推荐