• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
丽人至上再 显示全部楼层 发表于 2021-10-26 13:03:19 |阅读模式 打印 上一主题 下一主题
存储过程和存储函数指存储在数据库中供全部用户步伐调用的子步伐叫存储过程、存储函数
存储过程没有返回值。存储函数有返回值

  创建存储过程
      用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;

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作