Есть ли какой-либо альтернативный метод для "подключения через" в Oracle?
Я ищу альтернативу CONNECT BY
:
Select SUBSTR(str,1,LEVEL) OUTPUT FROM
(
SELECT 'ORACLE' As str FROM DUAL
)
CONNECT BY LEVEL<=LENGTH(str);
Какие-либо предложения?
3 ответа
Несколько вариантов:
Запрос 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 выбранных строк