oracle存储过程begin end;

begin…end语句简介

begin...end语句用于定义语句块,语句块由一组一起执行的SQL语句组成。 语句块也称为批处理。

begin end形成一个语句块,语句块不会起到事务的作用,也不会起到作用域的作用,它只是有时候看起来更清晰。

begin...exception 用于捕获异常,处理各种异常。

语法如下:

begin
  程序代码块;
exception
  when <异常1> then
    异常语句1;
  when <异常2> then
    异常语句2;
  when others then
    其它异常;
end;

创建表test如下:

create table test(
  f1 varchar2(3),
  f2 varchar2(3)
);
insert into test(f1,f2) values (1,1);
insert into test(f1,f2) values (2,2);
insert into test(f1,f2) values (3,3);

创建一个名称为pro_test 的存储过程

create or replace procedure pro_test(q_time in date) as
  v_count int; --定义一个计数器
  cursor cur_sb is
    select f1, f2 from test; --定义一个游标:cur_sb
  v_row cur_sb%rowtype; --定义游标变量

  /*开始运行*/
begin

  --代码块1
  begin
    dbms_output.put_line('代码块1'); --打印日志
    v_count := 0; --变量赋值
    open cur_sb; --打开游标
    -- 使用loop  end loop遍历游标
    loop
      fetch cur_sb
        into v_row; --取出一行数据,放入到cur_sb中
      exit when cur_sb %notfound; --当找不到记录时(最后一行后)退出循环
      update test set f2 = '111' where f1 = v_row.f1; --业务代码
      --insert into test (f1, f2) values (1, 1111111111111111111111111); --业务代码
      dbms_output.put_line('遍历行:' || v_row.f1); --打印日志
    end loop;
    close cur_sb; --关闭游标
    commit; --提交
  exception
    --捕获各种异常
    when dup_val_on_index then
      --捕获唯一索引重复异常
      rollback; --回滚
      dbms_output.put_line('出现唯一索引异常,这里才会执行'); --打印日志
    when others then
      --捕获其他所有异常
      rollback; --回滚
      dbms_output.put_line('其他所有异常'); --打印日志
  end;

  --代码块2
  begin
    dbms_output.put_line('代码块2'); --打印日志
  end;

  -- 执行一些ddl语句
  execute immediate 'truncate table test';
  dbms_output.put_line('代码块3'); --打印日志
  /*结束运行*/
end pro_test;

注意不要把代码写到异常后面去了,不然执行不到。

最好使用begin...end代码块,来包裹各种不同的业务,让代码更清晰。

执行ddl语句

  /*清空表数据*/
execute immediate 'truncate table test';

如提示oracle execute immediate 权限不足ora-01031

加上 AUTHID CURRENT_USER 即可。

create or replace procedure PRO_CLEAR_TEMP_TABLESPACE AUTHID CURRENT_USER is
  v_start_time date; --执行开始时间
  v_end_time   date; --执行完成时间
  v_use_time   int; --执行用时,单位:秒
begin

  begin
    -- 清除临时表空间
    v_start_time := sysdate;
    execute immediate 'alter tablespace IRFS_TEMP shrink space';
    dbms_output.put_line(sysdate); --打印
    v_end_time := sysdate;
    -- ceil向上取整
    v_use_time := ceil((v_end_time - v_start_time) * 24 * 60 * 60);
    --日志记录
    insert into clear_temp_tablespace_log
      (create_time, use_time)
    values
      (sysdate, v_use_time);
    commit;
  end;

end PRO_CLEAR_TEMP_TABLESPACE;

虽然加上 AUTHID CURRENT_USER 可以临时解决执行权限问题,但是在job任务中还是会报执行权限问题。

需要显示地赋权限。

GRANT alter tablespace TO 用户名;

GRANT alter tablespace TO MCQHW;

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值