2.oracle 创建临时表 部分2,(把存储过程sql执行的结果,保存临时表中,然后把临时表作为结果集)返回给用户

create or replace procedure TestInPutOutPut2
as 
  vv_cont  number(8);
  vals2  A_TEMP%ROWTYPE;
  v_count INT;
  str varchar2(2000);
  vv_sql varchar2(2000);
BEGIN
  v_count := 0;
  str:='drop table SETT_DAILYTEST';
  execute immediate str;
  commit;                                               --1.如果这个临时表已经存在了,则删除这个临时表
  
  str:='CREATE GLOBAL TEMPORARY TABLE SETT_DAILYTEST (     --2.创建表
        p1 VARCHAR2(20),
        p2 VARCHAR2(20),
        p3 VARCHAR2(20),
        p4 VARCHAR2(20),
        p5 VARCHAR2(20) )
        ON COMMIT PRESERVE ROWS';
       
  vv_sql:='select nvl(w1.mon,w2.mon)mon, nvl(w1.ty_yq_sl,0) 统印_以, nvl(w1.ty_bn_sl,0)  统印_今, nvl(w2.gm_yq_sl,0) 冠_以, nvl(w2.gm_bn_sl,0)冠_今
          from
              (select nvl(t1.sl,0) ty_yq_sl ,nvl(t2.sl,0) ty_bn_sl , nvl(t1.montn,t2.montn ) mon
              from (select  montn ,sl from aaa_test  where invtype =0   and preyearthisyear =-1) t1 full join
                    (select montn ,sl from aaa_test where  invtype =0 and preyearthisyear =0 ) t2
                   on t1.montn = t2.montn ) w1 full join
              (select nvl(t1.sl,0) gm_yq_sl,nvl(t2.sl,0) gm_bn_sl, nvl(t1.montn,t2.montn ) mon
              from (select  montn ,sl from aaa_test  where invtype =1   and preyearthisyear =-1) t1 full join
                    (select montn ,sl from aaa_test where  invtype =1 and preyearthisyear =0 ) t2
                   on t1.montn = t2.montn ) w2  
              on  w1.mon = w2.mon';
                                      --3.创建临时表,并且把   vv_sql中的查询结果保存到 临时表当中    
  execute   immediate 'grant create table to inv';
  execute immediate str;    
  str:='insert into SETT_DAILYTEST ('||vv_sql||')';  --4.使用动态SQL语句来执行(创建临时表,并且把   vv_sql中的查询结果保存到 临时表当中)
  commit;
  execute immediate str;
  select count(*) into v_count from SETT_DAILYTEST; --5.看看装进来了多少条数据

 

end TestInPutOutPut2;

posted on 2014-01-03 15:16  fantiejun0436  阅读(249)  评论(0)    收藏  举报

导航