Получение диапазонов из ряда чисел из таблицы и сохранение всех диапазонов в строковой переменной в формах PLSQL/Oracle.

У меня есть таблица, содержащая ряд чисел 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».

У меня есть код для генерации гнева в 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

person Hayat Muhammad    schedule 31.07.2015    source источник


Ответы (1)


Как упоминалось здесь, поскольку вывод представляет собой список строк, вы можете объявить и сохранить вывод в 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.

person Lalit Kumar B    schedule 31.07.2015
comment
Если я хочу получить противоположный результат, то есть пропустить 4-4, 8-9, 13-19, то какие изменения потребуются в приведенном выше запросе, пожалуйста. - person Hayat Muhammad; 05.08.2015
comment
@HayatMuhammad См. lalitkumarb.com/2015/07/22/ - person Lalit Kumar B; 10.08.2015