带参数的存储过程
存储过程允许带有参数,参数的使用将增加存储过程的灵活性,给数据库编程带来极大的方便。
存储过程中如果使用了参数,在执行存储过程时必须为其指定参数。总的来说,参数可以是常量、变量和表达式等。
Oracle有三种参数模式:
- IN
- OUT
- IN OUT
IN参数
该类参数值由调用者传入,并且只能够被存储过程读取。这种模式的参数是最常用的,也是默认的参数模式。
示例:创建一个带有输入参数的存储过程,当使用Insert_student添加学生信息时,用户只需要向该存储过程传入参数值,然后由存储过程从中读取数据。
create or replace procedure Insert_student(SNO IN varchar2,SNAME IN varchar2,SSEX IN char,SAGE IN number,SDEPT IN varchar2) is
begin
insert into student
values(SNO,SNAME,SSEX,SAGE,SDEPT);
exception
when dup_val_on_index then dbms_output.put_line('重复的学生ID');
when others then dbms_output.put_line('发生其它错误!');
end Insert_student;
执行存储过程并传递参数:
共有三种方式:
-
名称传递
-
位置传递
-
组合传递
OUT参数
该类参数值由存储过程写入。
示例:创建一个带有输出参数的存储过程,该存储过程根据学生的姓名返回该学生的所属学院。
create or replace procedure p_getSdept(NAME IN varchar2,DEPT OUT varchar2)
is
temp varchar(20);
begin
select s.SDEPT into temp
from student s
where s.SNAME=NAME;
DEPT := temp;
end p_getSdept;
执行:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020010419172434.png)
### IN OUT参数
==示例:使用IN OUT参数交换两个变量的值==
```sql
create or replace procedure p_swap(value1 in out number,value2 in out number)
is
temp number;
begin
temp := value1;
value1 := value2;
value2 := temp;
end p_swap;
执行:
declare
var_1 varchar2:=1;
var_2 varchar2:=2
begin
p_swap(var_1,var_2);
dbms_output.put_line('var_1='||var_1);
dbms_output.put_line('var_2='||var_2);
end;
默认值问题
创建存储过程的同时可以给输入参数提供默认值。OUT和IN OUT参数不具有默认值。
示例:根据传入SNO查询学生姓名,默认查询1号学生姓名
create or replace procedure p_getStudent(s_no in varchar2 default '1')
is
name varchar2(20);
begin
select SNAME into name
from student
where SNO = s_no;
dbms_output.put_line('name='||name);
end p_getStudent;
执行: