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语句被撤销了。