有一个小项目,字段来源不同的表,具体来源如下:
表dtrr_result中的字段
照核时间  (数据源:L3 dtrr_result.check_time)
生产时间  (数据源:L3 dtrr_result.product_date)
钢卷号 (数据源:L3 dtrr_result.coil_no)
板坯号 (数据源:L3 dtrr_result.slab_no)
出钢记号 (数据源:L3 dtrr_result.steel_grade)
精轧入口温度命中率(数据源:L3 dtrr_result.TEMP_FT_ENTRY_HIT )
加炉号 (数据源  L3 dtrr_result .FURNACE_NO)
计划板坯温度跳跃(数据源:L3 dtrp_result.ES_OUT_TEMP_NOM  )
各段在炉时间 (数据源:L3 dtrr_reuslt.factzonetm2)
总在炉时间(数据源:L3 dtrr_result.IN_FURNACE_PERIOD )
拒收原因   (数据源:L3 dtrr_result.REJECT_CAUSE) (筛选条件 REJECT_CAUSE为 50 或 51 的过滤掉)
表l2_charactor中的字段
钢卷号  (数据源:L3 L2_charactor.prod_id )
实际中间坯厚度(数据源:L3 l2_charactor.FM_IN_ROLL_THICK_NOM)
出炉温度      (数据源:L3 l2_charactor.FCEXTEMP)
表dtrr_result 和表 l2_charactor通过 coil_no=prod_id来对勾。
要加上条件:
delete * from dtrr_result where coil_no not in (select distinct PROD_ID from l2_charactor);
保证钢卷号信息完整。请问用oracle 存储过程如何实现上面的功能。
现在的想法是:先从dtrr_result表中把需要的字段筛选出来现放到临时表中,再把l2_charactor表中需要的字段筛选出来放到另外一张临时表中,再根据条件处理
然后left join 成一张表(以dtrr_result表为主表)像这种要求,如果不用动态SQL能实现吗,如何实现,(事先不把临时表建好,因为实际应用表结构是不预知的),望各位帮忙解答谢谢 

解决方案 »

  1.   

    描述的不是很清楚,你可以把sql过程写出来
      

  2.   

    说简单点就是有两张表A,B
    A中有字段 A1,A2,A3,A4,A5,A6,A7,A8,A9.... ,其中A1是关键字
    B中有字段 B1,B2,B3,B4,B5,B6,B7,B8,B9....., 其中B1是关键字
    A和B 通过A1=B1来 left join
    现在我要生成一张表从A中取A1,A2,A3,A4,A5字段,从B中取B1,B2,B3字段,然后left join 成一张表
    条件有:从A中取数据时过滤 A5 not in ('50','55'),
    A中的数据取出来后要执行下面的语句删除无效记录
    delete * from a where a2 not in (select distinct b1 from b); 
    最后 left join 成一张大表
    用存储过程如何实现谢谢 
      

  3.   

    为什么要先左连接再去掉A表中不在B表的记录,而不是直接INNER JOIN?
      

  4.   

    create or replace procedure proc 
    is 
    begin
      execute immediate 'create table tmp1 as 
                         select a.a1,
                                a.a2,
                                a.a3,
                                a.a4,
                                a.a5,
                                b.b1,
                                b.b2,
                                b.b3
                         from   A a,
                                B b
                         where  a.a1    = b.b1(+)
                         and    exists (select 1 from b t where t.b1 = a.a1)
                         and    a.a5 not in (''50'',''51'')';end proc;
    /只能用动态sql,因为建表语句不能写在procedure中。DML操作。
      

  5.   

    create global temporary table tmp1 on commit preserve rows
      as 
    select a.a1,a.a2,a.a3,a.a4,a.a5,b.b1,b.b2,b.b3
    from (select * from a
            where not exists(select 1 from b where b1=a.a2)
              and a5 not in('50','55'))a
        left join b
        on a.a1=b.b1
    (事先不把临时表建好,因为实际应用表结构是不预知的)是什么意思,表名和字段实现都不知道?那么条件如何确定