三种参数模式:in,out,in out
1.in参数(只读参数)
▪当过程被调用时,实参的值将传入该过程
▪形参的值不能被修改,只能被存储过程读取,也就是说形参不能作为赋值目标
▪默认的参数模式使In参数
▪当过程结束时,实参的值不会改变
2.out参数(只写参数)
▪当过程被调用时,实参的值将忽略不计,不能传给形参
▪形参的作用相当于没有被初始化的PL/SQL变量,其值为NULL,形参的值可以在过程中被修改
▪实参必须是变量
▪当过程结束时将形参的内容赋给实参
SQL> create procedure count_emp 2 (v_deptno dept.deptno%type,v_count out number) 3 as 4 begin 5 select count(*) into v_count from emp group by deptno having deptno=v_deptno; 6 dbms_output.put_line('部门'||v_deptno||'有'||v_count||'个雇员'); 7 end count_emp; 8 / 过程已创建。
调用方式:
方法1: SQL> variable v_count number; SQL> exec count_emp(10,:v_count); 部门10有3个雇员 PL/SQL 过程已成功完成。 方法2: SQL> declare 2 v_count number; 3 begin 4 count_emp(10,v_count); 5 end; 6 / 部门10有3个雇员 PL/SQL 过程已成功完成。
3.in out参数(可读写参数)
▪形参可以读取,也可以写入,过程调用时,将实参的值传入给形参,过程结束后,又将形参的值赋给实参
▪形参和实参都必须是变量
4.形参不需要对数据类型进行约束,约束来自于实参
5.形参的默认值,只有In参数有默认值
SQL> create or replace procedure p_emp 2 (v_id in number default 4) 3 as 4 begin 5 insert into emp(ename,empno) values('林慧',v_id); 6 end; 7 / 过程已创建。
SQL> create or replace procedure p_emp 2 (v_id out number default 4) 3 as 4 begin 5 insert into emp(ename,empno) values('林慧',v_id); 6 end; 7 / 警告: 创建的过程带有编译错误。 SQL> show error PROCEDURE P_EMP 出现错误: LINE/COL ERROR -------- ----------------------------------------------------------------- 2/2 PLS-00230: OUT 和 IN OUT 的形参不能有默认表达式
6.实参和形参的匹配办法
▪位置表示法:依靠位置顺序来标识
▪命名表示法:使用‘=>’来标识,即:形参名=>实参名(实参值)
begin -- 位置表示法 p_param_default('Good ', 'morning', 1, sysdate+1); -- 命名表示法 p_param_default(param1 => 'Good',param4=>sysdate+1); -- 混合表示法 p_param_default('Good', param4 => sysdate + 1); End;
注意:一般情况下,定义过程时,建议没有默认值的in参数放在参数列表的开始位置,其后是out参数,然后是in out参数,最后是有默认值的in参数