27、PLSQL中 过程
Update date:
1、概念
对完成某一个功能的 一组 sql 语句和 plsql语句的一个逻辑整体。
这个逻辑整体有一个名字 对应 数据库中的逻辑。
2、复用
3、定义两个整数变量 选出 两个变量的最大值
declare
var_x number:=20;
var_y number:=30;
begin
if var_x < var_y then
dbms_output.put_line(var_y);
else
dbms_output.put_line(var_x);
end if;
end;
/
------------------------------------------------------------------------------------------
create or replace procedure getmax(var_x number,var_y number)
is
begin
if var_x < var_y then
dbms_output.put_line(var_y);
else
dbms_output.put_line(var_x);
end if;
end;
/
4、调用
call getmax(1,10);
------------------------------------------------------------------------------------------
execute getmax(200,300);
------------------------------------------------------------------------------------------
通过plsql程序来调用
begin
getmax(101,999);
end;
/
5、写一个存储过程 可以完成两个参数最小值的选取 并使用匿名块调用
create or replace procedure getmin(var_x number:=1,var_y number:=2)
is
begin
if var_x < var_y then
dbms_output.put_line(var_x);
else
dbms_output.put_line(var_y);
end if;
end;
/
call getmin();
execute getmin;
execute getmin();
------------------------------------------------------------------------------------------
当不需要给参数传值时 call 必须使用() execute 可以省略()
如果参数有默认值 则可以不给参数传值 不传值则使用参数的默认值 传值则会替代掉默认值
execute getmin(8899,9988);
查看公司文档 搜索默认值 也可以测试得出默认值 最后还可以查看存储过程源代码
select text from user_source where name='GETMIN';
6、调用别人的存储过程 一般会先查看存储过程
desc 过程名;
desc getmin;
SQL> desc getmin;
------------------------------------------------------------------------------------------
PROCEDURE getmin
Argument Name Type In/Out Default?
------------------------------ ------------ ----------- ------ --------
VAR_X NUMBER IN DEFAULT
VAR_Y NUMBER IN DEFAULT
查看一个存储过程 可以获取
参数的名字
参数的类型
参数的模式
------------------------------------------------------------------------------------------
in 默认的 代表参数只负责给存储过程传入值
out 代表只给存储过程传出值
in out 代表参数即给存储过程传入值 又给存储过程传出值
参数的默认值
public static void getnum(int x){
x=10001;
}
public static void getString(String x){
x=x+"abc"
}
public static void getStringBuf(StringBuffer y){
y.append("cba");
}
static main(String[] args){
String x = new String ("nba");
getString(x);
x
StringBuffer y = new StringBuffer("nba");
getStringBuf(y);
y
}
7、参数的模式
in 只负责给存储过程 传入参数值
create or replace procedure getnum(var_x number )
is
begin
dbms_output.put_line(var_x);
var_x:=10001;
end;
/
通过show errors 可以看到 var_x 只能读不能写 证明它只负责传入 不负责传出
out 参数 只负责给存储过程 传出参数值
设计一个存储过程 有三个整数参数 打印前两个参数的最大值 并且把前两个参数的和存入第三个参数中
create or replace procedure getmax_and_sum(var_x number,var_y number,
var_z out number)
is
begin
if var_x < var_y then
dbms_output.put_line(var_y);
else
dbms_output.put_line(var_x);
end if;
var_z:=var_x+var_y;
end;
/
注意:out 修饰的参数 必须是变量
declare
var_z number:=0;
begin
getmax_and_sum(1,100,var_z);
dbms_output.put_line(var_z);
end;
/
in out 参数 即负责给存储过程传入参数值 又负责传出值
设计一个存储过程 有两个整数参数 打印两个参数的最大值 并且把两个参数的和存入第二个参数中
create or replace procedure getmax_and_sum(var_x number,var_y in out number)
is
begin
if var_x < var_y then
dbms_output.put_line(var_y);
else
dbms_output.put_line(var_x);
end if;
var_y:=var_x+var_y;
end;
/
按照参数的位置赋值
declare
var_t number:=99;
begin
getmax_and_sum(100,var_t);
dbms_output.put_line(var_t);
end;
/
按照参数的名字赋值
declare
var_t number:=99;
begin
getmax_and_sum(var_y=>var_t,var_x=>100);
dbms_output.put_line(var_t);
end;
/
8、设计一个存储过程 第一个参数代表从1 加到的数 第二个参数 用来存储前n项的和 调用这个存储过程 看计算是否正确
create or replace procedure getNumN(var_n number,var_sum out number)
is
begin
var_sum:=(1+var_n)*var_n/2;
end;
/
-----------------------------------------------------------------------------------------
declare
var_s number:=0;
begin
getNumN(100,var_s);
dbms_output.put_line(var_s);
end;
/