最近在项目中需要写存储过程,于是在自己学习了一段时间,总结下,希望对大家学习有些帮助;
先上模板:
create or replace procedure 要创建的存储过程名称(入参a in varchar2, 出参b out varchar2)
is
v_sql varchar(1000) ;
c varchar2(2000); //中间变量 (数据类型要知道长度,否则会报错)
d number(10); //中间变量
begin
if a=1 then c := '是' ; //判断语句
else c := '否' //赋值语句
end if;
v_sql:='select语句'; //执行sql
execute immediate v_sql into b; //把查询的结果放到b中输出;
MSG := 'success'; //成功的标识
end;
以下面例子为例:
create or replace procedure vsql_test(project_id INT DEFAULT 999999, v_sql varchar ,resjson out varchar,res out varchar)
is
v_asql varchar(4000) :='';
v_month VARCHAR(10) :='2019-04-06';
year_month_day VARCHAR(10) :='2019-04-06';
v_a1 INT :=1;
v_a2 INT :=1;
v_a3 INT :=1;
v_a4 DOUBLE :=1;
begin
//获取系统时间
year_month_day:=to_char(SYSDATE,'yyyy-mm-dd');
//判断时间
if substr(year_month_day,1,4) = '2019' then
v_month:= '2019-04-21';
else
v_month:= '201904-22';
end if;
//为了提高过程的可用性,加入了v_sql变量,用于改动sql
v_asql:= 'select count(1),count(distinct set_row_id)
from aa.test
where date= '''||v_month_now|| ''' ' || v_sql; // '''||v_month_now|| ''' 用于在sql中连接定义的变量
execute immediate v_asql into v_a1,v_a2 ; //赋值
v_asql:= 'select count(distinct set_row_id)
from aa.test1
where date= '''||v_month|| ''' ' || v_sql ;
execute immediate v_asql into v_a3 ;
--计算v_a4的值
v_a4:=nvl((v_a2+v_a1+v_a3)/4,0) ;
--将所得结果以json的格式返回
resjson := '{"v_a4:"'||to_char(v_a4)||",v_a3:"||to_char(v_a3)||'}' ;
res := 'success';
end;