Oracle存储过程的使用

论坛 期权论坛 脚本     
匿名技术用户   2020-12-30 08:26   11   0

最近在项目中需要写存储过程,于是在自己学习了一段时间,总结下,希望对大家学习有些帮助;

先上模板:

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; 

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP