Есть ли какой-либо альтернативный метод для "подключения через" в Oracle?

Я ищу альтернативу CONNECT BY:

Select SUBSTR(str,1,LEVEL) OUTPUT FROM
(
    SELECT 'ORACLE'  As str FROM DUAL
)
CONNECT BY LEVEL<=LENGTH(str);

Какие-либо предложения?

3 ответа

Несколько вариантов:

SQL Fiddle

Запрос 1 - Используйте коллекцию:

Значения здесь жестко запрограммированы, так что это, вероятно, не лучшее решение, если у вас нет списка фиксированной длины.

SELECT SUBSTR( 'ORACLE', 1, COLUMN_VALUE ) AS value
FROM   TABLE( SYS.ODCINUMBERLIST( 1, 2, 3, 4, 5, 6 ) )

Результаты:

|  VALUE |
|--------|
|      O |
|     OR |
|    ORA |
|   ORAC |
|  ORACL |
| ORACLE |

Запрос 2 - Используйте конвейерную функцию для генерации коллекции:

CREATE OR REPLACE FUNCTION get_numbers (
  maximum IN NUMBER
) RETURN SYS.ODCINUMBERLIST PIPELINED AS
BEGIN
  FOR i IN 1 .. maximum LOOP
    PIPE ROW(i);   
  END LOOP;
  RETURN;
END;
/

SELECT SUBSTR( 'ORACLE', 1, COLUMN_VALUE ) AS value
FROM   TABLE( get_numbers( LENGTH( 'ORACLE' ) ) )

Результаты:

|  VALUE |
|--------|
|      O |
|     OR |
|    ORA |
|   ORAC |
|  ORACL |
| ORACLE |

Запрос 3 - Используйте непотрубную функцию для генерации коллекции:

CREATE OR REPLACE FUNCTION get_numbers2 (
  maximum IN NUMBER
) RETURN SYS.ODCINUMBERLIST
AS
  v_nums SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST();
BEGIN
  v_nums.EXTEND( maximum );
  FOR i IN 1 .. maximum LOOP
    v_nums(i) := i;   
  END LOOP;
  RETURN v_nums;
END;
/

SELECT SUBSTR( 'ORACLE', 1, COLUMN_VALUE ) AS value
FROM   TABLE( get_numbers2( LENGTH( 'ORACLE' ) ) )

Результаты:

|  VALUE |
|--------|
|      O |
|     OR |
|    ORA |
|   ORAC |
|  ORACL |
| ORACLE |

Запрос 4 - Использовать рекурсивный факторинг подзапросов:

WITH data ( value ) AS (
  SELECT 'ORACLE' FROM DUAL
  UNION ALL
  SELECT SUBSTR( value, 1, LENGTH( value ) - 1 )
  FROM   data
  WHERE  LENGTH( value ) >  1
)
SELECT * FROM data

Результаты:

|  VALUE |
|--------|
| ORACLE |
|  ORACL |
|   ORAC |
|    ORA |
|     OR |
|      O |

ВЫБЕРИТЕ RPAD(LPAD('ORACLE',ROWNUM,'ORACLE'),7) КАК ГРАФ из emp, где rownum <7

Вот программа пирамиды.

ВЫБРАТЬ RPAD(LPAD('ILOVEYOU',ROWNUM,'ILOVEYOU'),9) ||LPAD(RPAD('ILOVEYOU',ROWNUM,'ILOVEYOU'),9)LOVEGRAPH ИЗ EMP ГДЕ ROWNUM<9 СОЮЗ ВСЕ ВЫБРАТЬ * ИЗ (ВЫБРАТЬ RPAD(LPAD('ILOVEYOU',ROWNUM,'ILOVEYOU'),9) ||LPAD(RPAD('ILOVEYOU',ROWNUM,'ILOVEYOU'),9)LOVEGRAPH ИЗ EMP, ГДЕ ROWNUM<9 ЗАКАЗАТЬ от ROWNUM DESC) /

LOVEGRAPH

II IL IL ILO ILOV ILOV ILOV ILOVE ILOVEY ILOVEY ILOVEYO ILOVEYOU ILOVEYOU ILOVEYOU ILOVEYOU ILOVEYO ILOVEYO ILOVEY ILOVE ILOVE ILOV ILOV ILOV ILO ILO ILO IL IL II

16 выбранных строк

Другие вопросы по тегам