Oracle 存储过程的默认值参数和过程中的事务处理

前端之家收集整理的这篇文章主要介绍了Oracle 存储过程的默认值参数和过程中的事务处理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.存储过程的参数也可以是默认值,这样当调用该过程时,如果未向参数传入值,则该参数将使用定义的默认值

#为JOB_PARAM,HIRE_PARAM和SALARY_PARAM参数设置了默认值,在调用该存储过程时,用户就不必再为这些参数提供值

sql> create or replace procedure add_employee(
  2    id_param in number,3    name_param in varchar2,4    job_param in varchar2 default 'SALESMAN',5    hire_param in date default sysdate,6    salary_param in number default 1000) is
  7  begin
  8    insert into scott.emp(empno,ename,job,hiredate,sal)
  9    values(id_param,name_param,job_param,hire_param,salary_param);
 10  end add_employee;
 11  /

过程已创建。

# 调用过程测试

sql> begin
  2    add_employee(8124,'海哥');
  3  end;
  4  /

PL/sql 过程已成功完成。

sql> select empno,sal
  2  from scott.emp
  3  where empno=8124;

     EMPNO ENAME      JOB       HIREDATE              SAL
---------- ---------- --------- -------------- ----------
      8124 海哥       SALESMAN  27-4月 -17           1000

2.在PL/sql过程中,不仅可以包括插入和更新这类DML操作,还可以包括事务处理语句COMMIT和ROLLBACK。对于过程而言,每个过程就相当于一个子事务,用户可以在自己事务处理的任何地方调用该过程,并且无论父事务是提交还是回滚,用户都可以确保过程中的子事务被执行。

#创建两个表TEMP和LOG_TABLE

sql> create table temp(n number);

表已创建。

sql> create table log_table(
  2    username varchar2(20),3    message varchar2(4000));

表已创建。

#建立一个存储过程INSERT_INTO_LOG,用于向表LOG_TABLE添加记录

sql> create or replace procedure insert_into_log(msg_param varchar2) is
  2     pragma autonomous_transaction;
  3  begin
  4   insert into log_table(username,message)
  5   values(user,msg_param);
  6   commit;
  7   end insert_into_log;
  8   /

#在匿名程序块中调用INSERT_INTO_LOG过程向LOG_TABLE表中添加数据,并使用INSERT语句向表TEMP添加数据

sql>  begin
  2     insert_into_log('添加数据到TEMP表之前调用');
  3     insert into temp
  4     values(1);
  5     insert_into_log('添加数据到TEMP表之后调用');
  6     rollback;
  7   end;
  8   /

PL/sql 过程已成功完成。

#对表中数据进行分析

sql> select * from temp;

未选定行

sql> select * from log_table;

USERNAME
--------------------
MESSAGE
--------------------------------------------------------------------------------

SCOTT
添加数据到TEMP表之前调用

SCOTT
添加数据到TEMP表之后调用
#总结:从结果可以看出,在TEMP表中并没有记录,说明INSERT语句被撤销了。

猜你在找的Oracle相关文章