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,ename,job,hiredate,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语句被撤销了。