jiezhi(西域浪子) :
请说说你用临时表的方法,可以给个例子吗?谢谢:)

解决方案 »

  1.   

    BlueskyWide(谈趣者) :
    建立视图?这个我没试过,可以详细说说吗?:P
      

  2.   

    create view table from tb1,tb2,...,tbn where ...;
      

  3.   

    create or replace procedure rldba.SP_QBYGFLQK_CHINA IS
    /*---------------------------------------
    功能:出中国石油统计报表《全部员工分类情况》
    编写:廖志强
    日期:2002年7月18日
    说明:该表为年报,只反映系统内的现状情况
    ---------------------------------------*/  CURSOR exist IS SELECT * FROM  user_objects WHERE object_name='T_QBYGFLQK_CHINA_TEMP';
      sql_str STRING(2000);
      insert_str STRING(2000);
      ExistOrNot user_objects%ROWTYPE;
      
      --单位员工
      v_dwyg CONSTANT STRING(150):='select count(*) from '||
                 '(select  distinct ygid from t_yggzsx) gz,t_ygjbxx yg where gz.ygid=yg.ygid';
                 
      --签订合同的员工,合同在生效状态
      v_dwyg_ht CONSTANT STRING(200):='select count(*) from '||
                '(select distinct ygid from t_yggzsx) gz,t_ygjbxx yg,t_yght ht '||
                ' where gz.ygid=yg.ygid and yg.ygid=ht.ygid and htzt like ''%生效%'''; 
      --内部退养的员工          
      v_dwyg_nt CONSTANT STRING(300):='select count(*) from '||
                '(select distinct ygid from t_yggzsx) gz,t_ygjbxx yg,t_nbty nt '||
                ' where gz.ygid=yg.ygid and yg.ygid=nt.ygid';            
    begin
        -- 判断临时表 T_QBYGFLQK_CHINA_TEMP 是否存在,如果存在,则删除该临时表
        OPEN exist;
        FETCH exist INTO  ExistOrNot;
        IF exist%FOUND THEN
           EXECUTE IMMEDIATE 'drop table T_QBYGFLQK_CHINA_TEMP';
        END IF; 
        CLOSE exist;
        
        --创建表
        sql_str:='create table T_QBYGFLQK_CHINA_TEMP(head varchar2(40),bh varchar2(10),';
        FOR v_count IN 1..19 LOOP
            sql_str:=sql_str||'f'||to_char(V_count)||' varchar(40),';
        END LOOP;
        sql_str:=rtrim(sql_str,',');
        sql_str:=sql_str||') tablespace users';
        EXECUTE IMMEDIATE sql_str;
        
        --插入标识行
        sql_str:='INSERT INTO T_QBYGFLQK_CHINA_TEMP(HEAD,BH,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,'||
                     'F13,F14,F15,F16,F17,F18,F19)'||
                  'VALUES'||
                    '(''甲'',''0'',''期末员工总数'',''长期员工'',''合同期为1-3年的员工数'','||
                    '''合同期为3-5年的员工数'',''合同期在5年以上的员工数'',''无固定期限的员工数'','||
                    '''临时员工数'',''在岗员工数合计'',''管理人员数'',''专业技术人员数'','||
                    '''操作服务人员小计数'',''操作人员数'',''服务人员数'',''在册不在岗员工数'','||
                    '''内部退养人员数'',''下岗人员数'',''待岗人员数'',''长期休假人员数'',''其他'')';
        EXECUTE IMMEDIATE sql_str;
        sql_str:='INSERT INTO T_QBYGFLQK_CHINA_TEMP(HEAD,BH)VALUES(''合计'',''1'')';
        EXECUTE IMMEDIATE sql_str;
        --更新数据
        ----------按用工期限
        sql_str:='update T_QBYGFLQK_CHINA_TEMP '||
                 'set '||
                 'f1=('||v_dwyg||'),'||
                 'f2=('||v_dwyg_ht||' and (ht.htqx>=1 or htlx=''无固定期限'')),'||
                 'f3=('||v_dwyg_ht||' and ht.htqx>=1 and ht.htqx<3),'||
                 'f4=('||v_dwyg_ht||' and ht.htqx>=3 and ht.htqx<5),'||
                 'f5=('||v_dwyg_ht||' and ht.htqx>=5),'||
                 'f6=('||v_dwyg_ht||' and ht.htlx=''无固定期限''),'||
                 'f7=('||v_dwyg_ht||' and ht.htqx<1)'||
                 ' where bh=''1''';
        EXECUTE IMMEDIATE sql_str;
        ---------在岗员工
        sql_str:='update T_QBYGFLQK_CHINA_TEMP '||
                 'set '||
                 'f8=('||v_dwyg||' and yg.zt=''在岗''),'||
                 'f9=('||v_dwyg||' and yg.zt=''在岗'' and yg.tsxbz=''管理人员''),'|| 
                 'f10=('||v_dwyg||' and yg.zt=''在岗'' and yg.tsxbz=''工程技术人员''),'||
                 'f11=('||v_dwyg||' and (yg.gwlb=''操作人员'' or yg.gwlb=''服务人员'')),'||
                 'f12=('||v_dwyg||' and yg.gwlb=''操作人员''),'||
                 'f13=('||v_dwyg||' and yg.gwlb=''服务人员'')'||
                 ' where bh=''1''';
        EXECUTE IMMEDIATE sql_str;
        ---------在册不在岗员工
        sql_str:='update T_QBYGFLQK_CHINA_TEMP '||
                 'set '||
                 'f14=('||v_dwyg||' and yg.zt<>''在岗''),'||
                 'f15=('||v_dwyg_nt||'),'||
                 'f16=('||v_dwyg||' and yg.tsxbz=''下岗人员''),'||
                 'f17=('||v_dwyg||' and yg.tsxbz=''待岗人员''),'||
                 'f18=('||v_dwyg||' and yg.tsxbz=''长期病伤假人员'')'||
                 ' where bh=''1''';
        EXECUTE IMMEDIATE sql_str;
        sql_str:='UPDATE T_QBYGFLQK_CHINA_TEMP '||
                 'SET '||
                 'f19=(SELECT (f14-f15-f16-f17-f18) FROM T_QBYGFLQK_CHINA_TEMP WHERE bh=''1'')'||
                 'WHERE bh=''1''';
        EXECUTE IMMEDIATE sql_str;
        COMMIT;
               
    end SP_QBYGFLQK_CHINA;
    这个是比较早的了,做法不好--容易产生碎片.你就看看做法吧。