2014-02-20 42 views
-1

此脚本将从以下字符串中获取序列,年,月和日...... 然后从序列部分找到缺失的数字(如1111,1112,115,..等) 问题在于输出这个脚本不正确不DBMS丢失号码缺少数字脚本不会工作?

EMP-1111_14_01_01_2141_G1

EMP-1112_14_01_01_1612_G1

EMP-1115_14_01_01_1109_G1

EMP-1116_14_01_01_1315_G1

EMP-1118_14_01_01_0910_G2

EMP-1121_14_01_01_1105_G1

EMP-1111_14_01_01_1120_G2

输出结果应该是这样的

缺少数1113

缺少数1114

缺少数1117

缺少数1118

缺少数1119

缺少数1120

declare 
    v_name   table1.ENAME%TYPE; 
    V_seq   NUMBER (4); 
    V_Year   number(2); 
    V_Month   number (2); 
    V_day   number (2); 
    max_seq   number(4); 
    min_seq   number(4); 

    CURSOR List_ENAME_cur IS 
    SELECT ENAME from table1 
    WHERE status = 2; 
begin 

    FOR List_ENAME_rec IN List_ENAME_cur loop 
    if REGEXP_LIKE(List_ENAME_cur.ENAME,'emp[-][1-9]{4}[_][1-9]{2}[_][1-9]{2}[_][1-9]{2}[_][0-9]{4}[_][G]["1"]') then 
     V_seq := substr(List_ENAME_cur.ename,5,4); 
     V_Year := substr(List_ENAME_cur.ename,10,2); 
     V_Month := substr(List_ENAME_cur.ename,13,2); 
     V_day := substr(List_ENAME_cur.ename,16,2); 


     if min_seq is null or V_seq_FILENAME < min_seq then 
     min_seq := V_seq_FILENAME; 
     DBMS_OUTPUT.PUT_LINE('Missing number '||min_seq); 
     end if; 

     if max_seq is null or V_seq_FILENAME > max_seq then 
     max_seq := V_seq_FILENAME; 
     DBMS_OUTPUT.PUT_LINE('Missing number '||max_seq); 
     end if; 

    end if; 
    end loop;  
    DBMS_OUTPUT.PUT_LINE('max_seq '||max_seq||' min_seq '||min_seq);  
end; 
+0

对于这个数据集,应该是什么样的预期结果? – SriniV

+0

结果应该是丢失号码1113,1114,1117,1118,1119,1120 – user334560415

+0

如果条件应该输出数值,如果循环是numm我是不是? – user334560415

回答

0

参见本实施例中

WITH ORDH 
    AS (SELECT 1111 AS ORDERNO FROM DUAL 
     UNION ALL 
     SELECT 1112 AS ORDERNO FROM DUAL 
     UNION ALL 
     SELECT 1115 AS ORDERNO FROM DUAL 
     UNION ALL 
     SELECT 1116 AS ORDERNO FROM DUAL 
     UNION ALL 
     SELECT 1118 AS ORDERNO FROM DUAL 
     UNION ALL 
     SELECT 1121 AS ORDERNO FROM DUAL), 
    GOT_NEXT_ORDERNO 
    AS (SELECT ORDERNO, 
       LEAD (ORDERNO) OVER (ORDER BY ORDERNO) AS NEXT_ORDERNO 
     FROM ORDH) 
SELECT ORDERNO + 1 AS FROM_NO, NEXT_ORDERNO - 1 AS TO_NO 
FROM GOT_NEXT_ORDERNO 
WHERE ORDERNO + 1 <> NEXT_ORDERNO; 

    FROM_NO  TO_NO 
---------- ---------- 
     1113  1114 
     1117  1117 
     1119  1120 

3 rows selected. 
+0

写入,上面的字符串仅仅是200万条记录的示例,s不会工作出...加上它不是PL/SQL的感谢 – user334560415