问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

oracle子程序和触发器的区别

发布网友 发布时间:2022-05-03 12:28

我来回答

2个回答

懂视网 时间:2022-05-03 16:50

4、子程序

回顾

练习:

declare
 v_name emp.ename%type:=‘张三‘;
 v_job emp.job%type:=‘游客‘; 
begin
 for n in 1..3 loop
  insert into emp(empno,ename,job,mgr,hiredate,sal,deptno) values(n*10,v_name||n,v_job,8000,to_date(‘2020-9-16‘,‘yyyy-MM-dd‘),16000,10);
  end loop;
  commit; --提交事务
 exception
  when others then
   rollback; --回滚事务
 end; 

学习目标

1、子程序

2、存储过程

3、函数

4、包

学习内容

1、子程序

plsql:过程化的sql语言;变量、常量、匿名块、分支语句、循环语句

子程序:命名的程序块,存储过程 和 函数。

2、存储过程

分析:完成一些指定的业务,单一的命令无法搞定;比如:转账,分页操作

存储过程:类似于java中的方法,通过多条sql命令,完成一个特定的任务。

优点:

1、执行效率高:预编译的,存储在服务器上,第一次创建好,系统会进行预编译;

2、减少网络流量:代码封装到过程中,只需要调用过程名就行。

3、安全性:A:小明 B:小红 C:小青

4、重用性:代码角度考虑。

存储过程中能写的命令:

1、insert,update,delete,select ...into 变量

2、过程控制命令(条件、循环)

3、不能写DDL

使用存储过程

1、定义过程

-- 创建过程 procedure:过程
create or replace procedure sp_test1(
 -- 参数
)
as
 -- 声明部分 (临时变量:过程中使用的变量)
  begin
   exception
  end;

2、调用过程

1 call 过程名(参数);

2、
begin
 过程名(参数);
end;

3、sqlplus:
execute 过程名();

栗子:

1、转账:无参数

create or replace procedure sp_zhuanzhang
as
 v_money bank.balance%type:=1000; --要转账的钱数
begin
  update bank set balance=balance-v_money where name=‘李四‘;
  update bank set balance=balance+v_money where name=‘张三‘;
  commit;
  exception
   when others then
    rollback;
 end;

调用:

call sp_zhuanzhang();

begin
 sp_zhuanzhang;
 end;

2、转账:带参数

--flag :1 :张三---》李四 2:李四 --->张三 钱数

create or replace procedure sp_zhuanzhang2
(
 --输入参数
 --参数名 数据类型(变量声明)
  flag in number,
  money in number
)
as
begin
  if flag=1 then
  update bank set balance=balance-money where name=‘张三‘;
  update bank set balance=balance+money where name=‘李四‘;
  else
   update bank set balance=balance-money where name=‘李四‘;
  update bank set balance=balance+money where name=‘张三‘;
   end if;
 commit;
 exception
  when others then
  rollback;
 end;

调用:

declare
 flag number(1):=2;
 money number(5):=500;
begin
 sp_zhuanzhang2(flag,money);
 end; 

3、转账:带输入和输出参数

create or replace procedure sp_zhuanzhang3
(
 --输入参数
 --参数名 数据类型(变量声明)
 flag in number,
 money in number,
  --输出参数:调用过程后,可以在外部获取到值的数据:类似于返回值,可以有多个
  balance1 out bank.balance%type,
  balance2 out bank.balance%type
)
as
begin
 if flag=1 then
  update bank set balance=balance-money where name=‘张三‘;
  update bank set balance=balance+money where name=‘李四‘;
 else
  update bank set balance=balance-money where name=‘李四‘;
  update bank set balance=balance+money where name=‘张三‘;
  end if;
 commit;
  select balance into balance1 from bank where name=‘张三‘;
   select balance into balance2 from bank where name=‘李四‘;
 exception
  when others then
  rollback;
 end;

调用:

 declare
  --声明变量:用来接受输出参数的值
  b1 bank.balance%type;
    b2 bank.balance%type;
 begin
   sp_zhuanzhang3(2,1000,balance2=>b1,balance1=>b2);
    dbms_output.put_line(‘张三:‘||b2||‘李四:‘||b1);
end;

过程调用中的参数传递

1、按照位置传递

2、按照名字传值:顺序无关

参数名=>变量 参数名=>变量 参数名=>变量

3、组合传递

位置传递+名字传递;位置传递(靠前)

3、函数

本质上跟过程一样:必须有返回值

定义函数:

create or replace function 名字(
 -- 参数
  --名字 类型
) return 数据类型
as
begin
  return 结果;
end;

例子:

1、根据部门编号查询部门名称

create or replace function f_getDname(
-- 传入参数 :部门编号
 dno dept.deptno%type 
) return varchar2 --返回字符串
as
 v_name dept.dname%type;
begin
  select dname into v_name from dept where deptno=dno;
  return v_name; --返回结果
end;

--调用

select empno,ename,deptno,f_getdname(deptno) 部门 from emp 
where f_getdname(deptno)=‘外交部‘;

2、根据部门编号统计部门人数

create or replace function f_getdeptcount(
 --参数
 dno number
)return number
as
 v_count number(5);
begin
  select count(*) into v_count from emp where deptno=dno;
  return v_count;
 end;

--调用
select deptno,dname,f_getdeptcount(deptno) 人数 from dept;

3、生成随机数字的函数

create or replace function getrandomvalue return number
as
 n number(20);
begin
 n:=dbms_random.value(1,10);
 return n;
end;

--调用

select getrandomvalue() from dual ;

调用:

declare
 n number(5);
begin
 n:=getrandomvalue();
 dbms_output.put_line(n);
end;

4、包

包:package

一系列的过程和函数

可以根据业务的不同创建不同的包:声明变量+过程+函数;

包:

1、包规范:类似于java中的接口

2、包体:类似于实现类

创建包规范:

create or replace package 名字
is
 --声明 变量 过程 函数
end 名字;

创建包体:

create or replace package body 名字
is
 --实现包规范定义好的过程和函数
end;

栗子:

create or replace package myfirstpackage
is
 --声明 全局的变量
  dno dept.deptno%type;
  --过程:向员工表中录入数据,不能录入重名的
  procedure add_emp(vno in number,vname in varchar2);
  --过程:根据部门编号,删除部门信息,只能删除没有员工的部门
  procedure del_dept(vno in number);
end package;

--包体
create or replace package body myfirstpackage
is
 --过程实现
 procedure add_emp(vno in number,vname in varchar2)
   as
    v_count number(2);-- 满足条件的员工的数量
   begin
    select count(*) into v_count from emp where ename=vname;
     if v_count>0 then
     --提示错误消息
     --dbms_output.put_line(‘‘);
     --raise_appliction_error:抛出一个自定义的错误消息,错误号:-20000-
     raise_application_error(-20001,‘名字重复‘);
     else
      insert into emp(empno,ename) values(vno,vname);
      commit;
     end if;
   end;

   --过程实现:根据部门编号,删除部门信息,只能删除没有员工的部门
   procedure del_dept(vno in number)
    as
     v_count number(3);
    begin
     --根据部门编号查询该部门对应的人数
     select count(*) into v_count from emp where deptno=vno;
      if v_count=0 then
      delete from dept where deptno=vno;
      commit;
      else
       raise_application_error(-20002,‘该部门下有员工,无法删除‘);
      end if;  
    end;
end myfirstpackage;

总结

1、存储过程

2、函数

相同点:

1、预编译、执行效率高、安全性、减少网络流量

2、输入参数、输出参数

不同点:

1、函数必须指定return(返回值)

3、包:包规范和包体(实现);

Oracle就业课之子程序

标签:bms   comm   lan   必须   tde   select   数据类型   创建过程   接受   

热心网友 时间:2022-05-03 13:58

oracle中触发器有三种1.DML触发器ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。2.替代触发器由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 怎样将一个网络共享文件夹映射为本地磁盘下的一个文件夹? 如何在DOS下映射共享文件夹为本地磁盘 俩台电脑如何共享文件 如何网络映射 怎么让域中的计算机开机自动映射网络上的共享文件夹 怎样能在微信上搜到异地附近人 有人知道怎么把服务器上的共享文件通过“映射网络驱动器”映射成服务器上的一个盘符吗? 卖二手电动车赚钱吗? 自己收了一台二手车想卖出去赚点小钱,一般销售渠道都在哪里? 我有个亲戚叫我跟他去学倒卖二手车,请问大家这个赚钱吗?最低得多少资金? 梦幻西游中钓鱼的起杆技巧是什么 用海竿钓鱼起杆的手法应怎么样 钓鱼的时候为什么要等到浮往上顶的时候在起杆,而不是鱼一往下拉浮的时候就起杆呢? 我想问一下电视画面不稳定起杆杆,是什么原因电视画面不稳定,一会正常一会起杆杆,是什么原因啦_百度问一问 我用的一款水密码的隔离霜。紫色乳液增白效果挺明显的,因为本人皮肤偏黄。最近想买一款BB,但BB一般 天蝎女拉黑你代表什么 道闸自动起杆 天蝎女反复拉黑拉回是不是想比在乎? 天蝎女拉黑一个人代表什么 感情,恋爱,求解答。天蝎女在什么情况下会拉黑刚分半个月的前男友 我是男生这两天总是起竿,你们怎么看? 猜谜语。 年纪并不大, 胡子一大把; 不论遇见谁, 总爱喊妈妈。 打一动物 皮黑肉儿白, 肚里墨样 哪个瞬间让你感受到独生子女的心累? 求教!磷酸铁锂钒车用动力电池,其聚合物,组成成分中是否含有铅,汞,砷等重金属物质,。。 有关写妈妈的爱的排比句 铁锂电池与锂聚合物电池优缺点比较 谁认识这个人,近来瞧瞧 溏心风暴之家好月圆荷妈年轻时的扮演者是? 急求脑筋急转弯!!~~ 谁知道为什么锂电池制造大国如日本、韩国很少用磷酸铁锂电池? 感恩母亲的短文,紧急! 磷酸铁钒锂电池可以安装三轮车上吗? 《家好月圆》中演荷妈年轻时候的演员是谁? rs文件怎么转换成视屏 十九了还能长个吗?? 我爱发明,怪车记。在哪能买上 谁能告诉下51交友里面51专门给我们收集的100跳交友笑话的网址啊 『CCTV10我爱发明』近期播出的一期节目 好像与新型蓄电池 或电动客车 有关!请问那期节目叫什么!? 马燕日记:一个感动世界的现代童话主要内容 最近几个月刷牙的时候牙齿总是会出血。为什么呢?还有就是如果嘴里老长溃疡应该怎样防止呢?3Q各位了!~ 牙龈里面怎么会出现像辣椒籽一样的呢?