2015-07-31 3 views
1

У меня есть таблица, содержащая ряд чисел 1,2,3,4,5,11,12,13 , 14,15,101,102,103,104,105,510,511,512,513,515,516,517. Я хочу функцию PL/SQL, чтобы получить диапазоны, а затем сохранить все диапазоны в одной строковой переменной в следующем формате. "1-5, 11-15, 101-105, 510-517".Получение диапазонов из серии чисел из таблицы и сохранение всех диапазонов в строковой переменной в формах PLSQL/Oracle

У меня есть код для генерации ярости в SQL * Plus, но он не работал в PL/SQL и формах. Процедура приведена ниже:

SQL> SET SERVEROUTPUT ON 
    SQL> DECLARE 
    2 v_list VARCHAR2(100); 
    3 BEGIN 
    4 SELECT listagg(RANGE, ',') WITHIN GROUP(
    5 ORDER BY min_num) 
    6 INTO v_list 
    7 FROM 
    8  (SELECT MIN(num) min_num, 
    9  MIN(num) 
    10  ||'-' 
    11  || MAX(num) range 
    12  FROM 
    13  (SELECT num, num-Row_Number() over(order by num) AS rn FROM t 
    14  ) 
    15  GROUP BY rn 
    16  ); 
    17 dbms_output.put_line(v_list); 
    18 END; 
    19/
    1-3,5-7,10-12,20-20 

ответ

1

Как уже упоминалось here, поскольку выходной список строк, можно объявить и хранения выходных данных в переменной varchar2.

Вы можете создать процедуру и поместить в нее всю логику.

Например,

Установка

SQL> CREATE TABLE t AS 
    2 SELECT * 
    3 FROM 
    4 (WITH data(num) AS 
    5 (SELECT 1 FROM dual 
    6 UNION 
    7 SELECT 2 FROM dual 
    8 UNION 
    9 SELECT 3 FROM dual 
10 UNION 
11 SELECT 5 FROM dual 
12 UNION 
13 SELECT 6 FROM dual 
14 UNION 
15 SELECT 7 FROM dual 
16 UNION 
17 SELECT 10 FROM dual 
18 UNION 
19 SELECT 11 FROM dual 
20 UNION 
21 SELECT 12 FROM dual 
22 UNION 
23 SELECT 20 FROM dual 
24 ) 
25 SELECT * FROM DATA); 

Table created. 

Процедура

SQL> CREATE OR REPLACE 
    2 PROCEDURE p_get_list 
    3 AS 
    4 v_list VARCHAR2(100); 
    5 BEGIN 
    6 SELECT listagg(RANGE, ',') WITHIN GROUP(
    7 ORDER BY min_num) 
    8 INTO v_list 
    9 FROM 
10  (SELECT MIN(num) min_num, 
11  MIN(num) 
12  ||'-' 
13  || MAX(num) range 
14  FROM 
15  (SELECT num, num-Row_Number() over(order by num) AS rn FROM t 
16  ) 
17  GROUP BY rn 
18  ); 
19 dbms_output.put_line(v_list); 
20 END; 
21/

Procedure created. 

Тестовый случай

SQL> SET SERVEROUTPUT ON 
SQL> BEGIN 
    2  p_get_list; 
    3 END; 
    4/
1-3,5-7,10-12,20-20 

PL/SQL procedure successfully completed. 

Вы можете просто вызвать процедуру в своих Oracle Forms.

+0

Хорошо, наконец, решена. –

+0

Если я хочу получить противоположный результат, т. Е. Отсутствует как 4-4, 8-9, 13-19 , то какие изменения потребуются в вышеуказанном запросе. –

+0

@ HayatMuhammad См. Http://lalitkumarb.com/2015/07/22/find-range-of-missing-values-in-a-sequence-of-numbers-or-dates/ –