PL/SQL程序单元

PL/SQL程序单元:

  • 是数据库中命名的PL/SQL块,作为数据库对象保存在数据库里。
  • 主要有四类:
    • 过程:执行特定操作,无返回值。有点像Java中的方法,无返回值。
    • 函数:进行复杂计算,有返回值。有点像Java中的方法,有返回值。
    • 包:逻辑上相关的过程和函数组织在一起。有点Java中类的感觉。
    • 触发器:事件触发,执行相应的操作。

存储过程介绍:

  • 参数模式:
    • IN:默认值,如果不写,就是IN。值被传递给子程序。子程序不能改变参数值,是从外部传入的。
    • OUT:如果想用,必须显示的指定出来,子程序会改变参数的值。
    • IN OUT:如果想用,必须显示的指定出来,子程序可以改变也可以不改变。

存储过程的快速入门:

  • 无参的存储过程:我是用的工具是PL/SQL Developer。创建存储过程如下:在开发工具的左边有一个
  • 点击右键出现:
  • 这个时候就会出现你输入名称的存储过程了,只不过是空的:也就是is,begin后面没有东西。
    /**
    第一个存储过程,向tab_stu插入一条数据
    **/
    
    create or replace procedure firstPro 
    --is相当于前面的declare在is后面写申明变量
    is
     v_stu_age number:=23;
    begin
      insert into tab_stu(stu_id,stu_name,stu_age,class_id)
      values(5,'德玛',v_stu_age,3);
      commit;
    end firstPro;

  • 输入上面的内容,编译器左上角的小齿轮。如果编译成功在第一个图的下有一个绿色的图标,它就是存储过程。
  • 如果要执行存储过程,选中编译好的存储过程,右键有一个“测试”选择,如果没有参数的直接运行就行,如果有参数会在下面提示输入参数。选中在运行那个小齿轮就行。

带参数的存储过程:

  • 带参数的存储过程,定义如下:
    /**
    带参数的存储过程
    **/
    create or replace procedure paramPro
    (
    --默认是输入参数
    v_stu_id varchar2,
    v_stu_name varchar2,
    v_stu_age number,
    v_class_id number
    ) 
    is
    begin
      insert into  tab_stu(stu_id,stu_name,stu_age,class_id)
      values(v_stu_id,v_stu_name,v_stu_age,v_class_id);
      commit;
    end paramPro;

定时备份的存储过程:

  • 下面来写一个每隔多长时间,就备份一次的存储过程。
  • 先写一个备份的存储过程:
    /**
    存储过程更多情况下是在数据库方做数据整合等复杂的工作
    需求:
    每天在规定时间需要备份tab_stu表的数据
    思路:
    1.备份上一次没有备份的数据。
    2.这个时候就需要有一个id来存储上次备份到那
    3.备份完后,需要修改id的值。
    4.还需要有一个备份表
    **/
    
    create or replace procedure backPro(
    --上次备份最后的id
    max_id number
    ) 
    is
    --用游标来存储,需要备份的数据
    cursor c_tab_stu is select * from tab_stu where stu_id>max_id;
    --定义rowtype
    r_tab_stu tab_stu%rowtype;
    
    --存储备份后的最大id的值
    v_max_id number;
    --索引值
    v_index number:=0;
    begin
      if c_tab_stu%isopen then
        null;
      else 
        open c_tab_stu;
      end if;
      --循环备份
      loop
        fetch c_tab_stu into r_tab_stu;
        exit when c_tab_stu%notfound;
        
        insert into tab_stu_back(stu_id,stu_name,stu_age,class_id) 
        values(r_tab_stu.stu_id,r_tab_stu.stu_name,r_tab_stu.stu_age,r_tab_stu.class_id);
        /**
        下面这样写因为:
        1.如果数据量很大的话,一次性提交或插入一条提交一次。都是不好的。
         1.1.一次性提交,因为Oracle是将回滚段存到内存中的,如果数据量很大内存会出现问题。
         1.2.如果插入一条提交一次,上面的问题没有了。但是性能非常的差
        2.这里就让它每插入2000条就提交一次。
        3.这里记得归零。
        **/
        if v_index>2000 then 
          commit;
          v_index:=0;
          else 
            v_index:=v_index+1;
        end if;
        
      end loop;
      
      commit;
      
      close c_tab_stu;
      --修改tab_max_id的max_id的值为备份表中的最大id的值
      
      select max(stu_id) into v_max_id from tab_stu_back;
      update tab_max_id set max_id=v_max_id;
      commit;
    end backPro;

  • 在创建一个调用存储过程的存储过程:
    --通过一个存储过程调用另一存储过程
    create or replace procedure invockParam
    is
    v_max_id number;
    
    begin
     select max_id into v_max_id from tab_max_id;
     --调用backpro存储过程
     backpro(v_max_id);        
    end invockParam;
    这里只要执行上面的存储过程就能备份了。
  • 下面是怎么实现自动备份。
    --创建调度任务定时器
    
    declare
      jobno number;--这个可以随便定义
    begin
      
      sys.dbms_job.submit(jobno,
                          what => 'invockParam;', --invockParam为存储过程的名称
                          Interval =>'TRUNC(sysdate,''mi'')+1/(24*60)' --定义时间间隔每分钟
                          );
      commit;
    end;
    上面的定时也可以通过PL/SQL  developer创建,还是左边的选择DBMS_Jobs右键新建,在弹出窗口中,查看sql。输入上面的内容就行。通过小齿轮运行。
  • 关于定义时间间隔问题,可以通过搜索“pl/sql创建调度任务定时器”。有很多非常好的文章介绍。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值