另外下面参数未用?V_BDATE DATE, V_EDATE DATE
条件也需要修改
相关贴子http://community.csdn.net/Expert/topic/3584/3584714.xml?temp=.6848566创建存储过程返回动态sql语句
CREATE OR REPLACE PROCEDURE P_TEST_TOP(V_BDATE DATE,
                                       V_EDATE DATE,
                                       v_sql OUT VARCHAR2) AS
  --此过程用于返回结果
  TYPE V_CURSOR IS REF CURSOR;
  MYCUR   V_CURSOR;
  V_TEMP  VARCHAR2(20);
  V_UNION VARCHAR2(20);
  V_TEMP2 VARCHAR2(1000);
  V_TEMP3 VARCHAR2(1000);
  V_TEMP4 VARCHAR2(1000);BEGIN
  v_sql   := ' SELECT 0 sign,''周'' ';
  V_TEMP2 := ' SELECT 1 sign,''准时'' ';
  V_TEMP3 := ' SELECT 2 sign,''晚到'' ';
  V_TEMP4 := ' SELECT 3 sign,''总数'' ';
  V_UNION := ' union ';
  OPEN MYCUR FOR
    SELECT DISTINCT CEIL(TO_NUMBER(TO_CHAR(SUB_DATE, 'DDD')) / 7) FROM T1;
  LOOP
    FETCH MYCUR
      INTO V_TEMP;
    EXIT WHEN MYCUR%NOTFOUND;
    V_SQL   := V_SQL || ' ,' || V_TEMP;
    V_TEMP2 := V_TEMP2 || ' ,f_test(' || V_TEMP || ',1)';
    V_TEMP3 := V_TEMP3 || ' ,f_test(' || V_TEMP || ',2)';
    V_TEMP4 := V_TEMP4 || ' ,f_test(' || V_TEMP || ',3)';
  END LOOP;
  V_SQL   := V_SQL || ' from t1';
  V_TEMP2 := V_TEMP2 || '  FROM t1,t2 WHERE t1.arr_city=t2.arr_city ';
  V_TEMP3 := V_TEMP3 || '  FROM t1,t2 WHERE t1.arr_city=t2.arr_city ';
  V_TEMP4 := V_TEMP4 || '  FROM t1,t2 WHERE t1.arr_city=t2.arr_city ';
  CLOSE MYCUR;
  V_SQL := V_SQL || V_UNION || V_TEMP2 || V_UNION || V_TEMP3 || V_UNION ||
           V_TEMP4 || 'order by 1';END P_TEST_TOP;

解决方案 »

  1.   

    准时到达有两种情况是 Or 关系if pro_type='c' 时 使用:(arr_date[转成小时]-subdate[转成小时] )<=t2.req_hour 并且 T1.ARR_CITY = T2.ARR_CITY  或者if pro_type='M' 时 使用:b_sub_date <= b_arr_date
    晚到达时间记录也有两种情况 if pro_type='c' 时 使用
       (arr_date[转成小时]-subdate[转成小时] )>t2.req_hour T1.ARR_CITY = T2.ARR_CITY  或者
    if pro_type='M' 时
    b_sub_date > b_arr_date
      

  2.   

    第一次发贴 http://community.csdn.net/Expert/topic/3584/3584714.xml?temp=.6848566
    西西基本解决了问题
    CREATE OR REPLACE PROCEDURE P_TEST_TOP(V_BDATE DATE,
                                           V_EDATE DATE,
                                           v_sql OUT VARCHAR2) 参数未用啊
    我又迷迷糊糊了,
      

  3.   

    if pro_type='c' 时 使用条件:(arr_date[转成小时]-subdate[转成小时] )<=t2.req_hour 并且 T1.ARR_CITY = T2.ARR_CITYif pro_type='c' 时 使用条件:b_sub_date <= b_arr_date
    这两个有什么不同?
      

  4.   

    准时到达有两种情况是 Or 关系if pro_type='c' 时 使用:(arr_date[转成小时]-subdate[转成小时] )<=t2.req_hour 并且 T1.ARR_CITY = T2.ARR_CITY  或者那是写错了if pro_type='M' 时 使用:b_sub_date <= b_arr_date
    晚到达时间记录也有两种情况 if pro_type='c' 时 使用
       (arr_date[转成小时]-subdate[转成小时] )>t2.req_hour T1.ARR_CITY = T2.ARR_CITY  或者
    if pro_type='M' 时
    b_sub_date > b_arr_date
      

  5.   

    (arr_date[转成小时]-subdate[转成小时] )<=t2.req_hour and pro_type='c' or pro_type='M' and b_sub_date <= b_arr_date取准时到达总数时用这个条件
      

  6.   

    但是如果 pro_type='c' 这个条件就变了
    SUM(DECODE(SIGN((T1.ARR_DATE - T1.SUB_DATE) * 24 - T2.REQ_HOUR),
                          -1,
                          0,
                          1))
    使用这个
    b_sub_date <= b_arr_date关键是如何判断,使加参数或者 if 什么的
      

  7.   

    IF V_TYPE = 1 THEN
        SELECT SUM(DECODE(SIGN((T1.ARR_DATE - T1.SUB_DATE) * 24 - T2.REQ_HOUR),
                          -1,
                          0,
                          1))
          INTO V_COUNTS
          FROM T1, T2
         WHERE T1.ARR_CITY = T2.ARR_CITY
           AND CEIL(TO_NUMBER(TO_CHAR(T1.SUB_DATE, 'DDD')) / 7) = V_WEEK;
    sum()是你查询的内容,where后面才是条件啊
      

  8.   

    是这样子的按时到达的记录有两种情况 如果t1的 t1.pro_type='c' 时使用(T1.ARR_DATE - T1.SUB_DATE) * 24 < T2.REQ_HOUR and t1.city=t2.city 条件 (实际到达日期-提货日期<t2中指定限定的小时数req_hour 并且t1.city=t2.city )如果t1的t1.pro_type='m' 时使用 t1.b_sub_date <= t1.b_arr_date 条件(补货实际到达日期小于补货预计到达日期)
      

  9.   

    你在存储过程和函数当中各加下where条件就行了。我没给你加。
      

  10.   

    有可能跨年度,而且随着arr_protype='c'或arr_protype='m'
    (T1.ARR_DATE - T1.SUB_DATE) * 24 - T2.REQ_HOUR
    是不是就换成t1.b_sub_date <= t2.b_arr_date怎么判断?
      

  11.   

    存储过程加个参数CREATE OR REPLACE PROCEDURE P_TEST_TOP(V_BDATE DATE,
                                           V_EDATE DATE,
                                           V_TYPE  VARCHAR2,
                                           V_SQL   OUT VARCHAR2) AS
      /*此过程用于返回结果
      参数描述:
        V_BDATE:开始日期
        V_EDATE:结束日期   这两个日期也就是你要查的2004-08-20 到 2004-10-08 这两个参数
        
        V_TYPE  :C.表示ON TIME 的条件 
                   ACT_ATAMIT - ACT_INSERTDATE(小时默认为23:00) < = LEAD TIME LEAD TIME 
                   在T2ALEADTIME中查出 条件为: 
                   ACT_SHIPFROM_PROVINCE.T2ASHIPMENTNO_KPI = FROM_PROVINCE.T2ALEADTIME 
                   ACT_SHIPFROM_CITY.T2ASHIPMENTNO_KPI = FROM_CITY.T2ALEADTIME ACT_PROVINCE1.T2ASHIPMENTNO_KPI = TO_PROVINCE.T2ALEADTIME 
                   OFF TIME 的条件 ACT_ATAMIT - ACT_INSERTDATE(小时默认为23:00) > LEAD TIME 
                 M.表示ON TIME 的条件 ACT_ATADESTNPORT < = ACT_ETADATE  
                   OFF TIME 的条件 ACT_ATADESTNPORT > ACT_ETADATE
               ALL.表示TOTAL = 在T2ASHIPMENTNO_KPI表中满足查询条件的 ACT_SHPMTNO的数量*/  TYPE V_CURSOR IS REF CURSOR;
      MYCUR   V_CURSOR;
      V_TEMP  VARCHAR2(20);
      V_UNION VARCHAR2(20);
      V_TEMP2 VARCHAR2(1000);
      V_TEMP3 VARCHAR2(1000);
      V_TEMP4 VARCHAR2(1000);BEGIN
      V_SQL   := ' SELECT 0 sign,''周'' ';
      V_TEMP2 := ' SELECT 1 sign,''准时'' ';
      V_TEMP3 := ' SELECT 2 sign,''晚到'' ';
      V_TEMP4 := ' SELECT 3 sign,''总数'' ';
      V_UNION := ' union ';
      IF V_TYPE = 'C' THEN
        OPEN MYCUR FOR
          SELECT DISTINCT CEIL(TO_NUMBER(TO_CHAR(SUB_DATE, 'DDD')) / 7)
            FROM T1 WHERE T1.SUB_DATE>=V_BDATE AND V_BDATE<=V_EDATE;
        LOOP
          FETCH MYCUR
            INTO V_TEMP;
          EXIT WHEN MYCUR%NOTFOUND;
          V_SQL   := V_SQL || ' ,' || V_TEMP;
          V_TEMP2 := V_TEMP2 || ' ,f_test(' || V_TEMP || ',1)';
          V_TEMP3 := V_TEMP3 || ' ,f_test(' || V_TEMP || ',2)';
          V_TEMP4 := V_TEMP4 || ' ,f_test(' || V_TEMP || ',3)';
        END LOOP;
        V_SQL   := V_SQL || ' from t1';
        V_TEMP2 := V_TEMP2 || '  FROM t1,t2 WHERE t1.arr_city=t2.arr_city ';
        V_TEMP3 := V_TEMP3 || '  FROM t1,t2 WHERE t1.arr_city=t2.arr_city ';
        V_TEMP4 := V_TEMP4 || '  FROM t1,t2 WHERE t1.arr_city=t2.arr_city ';
        CLOSE MYCUR;
        V_SQL := V_SQL || V_UNION || V_TEMP2 || V_UNION || V_TEMP3 || V_UNION ||
                 V_TEMP4 || 'order by 1';
      ELSIF V_TYPE = 'M' THEN
        OPEN MYCUR FOR
          SELECT DISTINCT CEIL(TO_NUMBER(TO_CHAR(SUB_DATE, 'DDD')) / 7)
            FROM T1 WHERE T1.SUB_DATE>=V_BDATE AND V_BDATE<=V_EDATE;
        LOOP
          FETCH MYCUR
            INTO V_TEMP;
          EXIT WHEN MYCUR%NOTFOUND;
          V_SQL   := V_SQL || ' ,' || V_TEMP;
          V_TEMP2 := V_TEMP2 || ' ,f_test(' || V_TEMP || ',1)';
          V_TEMP3 := V_TEMP3 || ' ,f_test(' || V_TEMP || ',2)';
          V_TEMP4 := V_TEMP4 || ' ,f_test(' || V_TEMP || ',3)';
        END LOOP;
        V_SQL   := V_SQL || ' from t1';
        V_TEMP2 := V_TEMP2 || '  FROM t1,t2 WHERE t1.arr_city<=t2.arr_city ';
        V_TEMP3 := V_TEMP3 || '  FROM t1,t2 WHERE t1.arr_city<=t2.arr_city ';
        V_TEMP4 := V_TEMP4 || '  FROM t1,t2 WHERE t1.arr_city<=t2.arr_city ';
        CLOSE MYCUR;
        V_SQL := V_SQL || V_UNION || V_TEMP2 || V_UNION || V_TEMP3 || V_UNION ||
                 V_TEMP4 || 'order by 1';
      ELSE
        OPEN MYCUR FOR
          SELECT DISTINCT CEIL(TO_NUMBER(TO_CHAR(SUB_DATE, 'DDD')) / 7)
            FROM T1 WHERE T1.SUB_DATE>=V_BDATE AND V_BDATE<=V_EDATE;
        LOOP
          FETCH MYCUR
            INTO V_TEMP;
          EXIT WHEN MYCUR%NOTFOUND;
          V_SQL   := V_SQL || ' ,' || V_TEMP;
          V_TEMP2 := V_TEMP2 || ' ,f_test(' || V_TEMP || ',1)';
          V_TEMP3 := V_TEMP3 || ' ,f_test(' || V_TEMP || ',2)';
          V_TEMP4 := V_TEMP4 || ' ,f_test(' || V_TEMP || ',3)';
        END LOOP;
        V_SQL   := V_SQL || ' from t1';
        V_TEMP2 := V_TEMP2 || '  FROM t1,t2 WHERE t1.arr_city=t2.arr_city ';
        V_TEMP3 := V_TEMP3 || '  FROM t1,t2 WHERE t1.arr_city=t2.arr_city ';
        V_TEMP4 := V_TEMP4 || '  FROM t1,t2 WHERE t1.arr_city=t2.arr_city ';
        CLOSE MYCUR;
        V_SQL := V_SQL || V_UNION || V_TEMP2 || V_UNION || V_TEMP3 || V_UNION ||
                 V_TEMP4 || 'order by 1';
      END IF;
    END P_TEST_TOP;