我要写一个oracle的存储过程,实现下面的功能,如果可以用sql实现,那就更好了!据我研究,好像写不出来啊!! 郁闷:已经前提:
  一:有第一张表A,纪录每个事件X发生的时间-->共100个事件
  二:有第二张表B,纪录每个事件Y发生的时间和事件具体信息-->共1000个事件求: 由A表,我可以知道的每个事件X发生时间,共100个时间点,我要找出,这100个时间点之后,在B表的前两笔事件Y的信息; 举例:A表X事件时间发生在10点,我要在B表的Y事件中找到10点之后发生的事件,那会有很多,我只找前两笔; 
      A表X事件时间发生在11点,我要在B表的Y事件中找到11点之后发生的事件的前两笔;
 

解决方案 »

  1.   

    大略看了下!不太懂!不好意思
    select
      B.Y
    from
      B
    where
      B.time > (
                 select
                   max(A.time)
                 from
                   A
                 )
      and rownum < 3
    order by
      B.time;
      

  2.   

    CREATE OR REPLACE PROCEDURE Lot_Afer_Test As
      Cursor Lot_test_time Is
          Select * From eQ_HISTORY_V a Where a.Begintmst > TO_DATE('2005-12-18 00:00:00','YYYY-MM-DD HH24:MI:SS')  
                                             And a.Begintmst < TO_DATE('2006-12-18 00:00:00','YYYY-MM-DD HH24:MI:SS')  
                                             And (a.Eq_Status='PM' Or a.Eq_Status='MONIT')
                                             And a.Pu='OXE-1A';                                       
    cur  integer;
    ret  integer;
    str  varchar2(1000);     
    tname Varchar2(1000);                             
    Begin
    tname := Lot_After_Test;
    str := 'create table '||tname||'(lot varchar2(32),'||
                                   ' process varchar2(32),'||
                                   ' product varchar2(32),'||
                                   ' stepname varchar2(32),'||
                                   ' processingunit varchar2(32),'||
                                   'recipe1 varchar2(32),'||
                                   'moveintmst varchar2(32),'||
                                   'moveouttmst varchar2(32)';
    cur := dbms_sql.open_cursor;
    dbms_sql.parse(cur, str, dbms_sql.v7);
    ret := dbms_sql.execute(cur);
    dbms_sql.close_cursor(cur);for rec in Lot_test_time Loop
        Cursor compare_result Is
            Select * From Lot_Job_History b Where b.Processingunit='OXE-1A' 
                                              And b.Moveintmst>TO_DATE('2005-12-01 00:00:00','YYYY-MM-DD HH24:MI:SS')  
                                              And b.Moveintmst<TO_DATE('2006-12-29 00:00:00','YYYY-MM-DD HH24:MI:SS')  
                                              And b.Moveintmst> rec.endtmst
                                              And Rownum <3
                                              Order By b.Moveintmst;
    --str := 'insert into '||tname||'(lot, process ,product ,'||
    --                                'stepname,processingunit,'||
    --                                'recipe1,moveintmst,moveouttmst) Values( :x, :y,:z,:a,:b,'||
    --                                ':c,:d,:e)';
        For rec1 in compare_result Loop
          Insert Into Lot_After_Test(lot,process,product,stepname,processingunit,recipe1,moveintmst,moveouttmst)
          Values (rec1.lot,rec1.process,rec1.product,rec1.stepname,rec1.processingunit,rec1.recipe1,rec1.moveintmst,rec1.moveouttmst);
        End Loopend loop;
    end;
      --    insert into spc_m1alarm_summary
        --            (product, lot_count, item_count, alarm_count, 
        --             alarm_ratio, from_time, end_time, week)
        --            values
        --            (w_product, w_lot_count, w_item_count, w_alarm_count, 
        --             w_alarm_ratio, i_from_time, i_end_time, w_week);  我写的,不过报错:PLS-00103;;help?!!!!   
      

  3.   

    可以实现,方法如下:
    declare
           cursor cur_x_date is select x_date from a;
           v_x_date a.x_date%TYPE;
         
    begin
         execute immediate 'truncate table b_temp';
         open cur_x_date;
         loop
         fetch cur_x_date into v_x_date;
         exit when cur_x_date%NOTFOUND;
         insert into b_temp (select corp,v_x_date  from 
                (select rownum rn,b.* from b where y_date >v_x_date ) where rn<3);
        
         end loop;
         commit;
         close cur_x_date;
    end;
      

  4.   

    select a.*, b.*
      from a, b
     where a.dt < b.dt
       and (select count(*)
              from b t
             where t.dt > a.dt
               and t.dt <= b.dt) between 1 and 2
     order by a.dt, b.dt;