упорядочение петли оракула - PullRequest
0 голосов
/ 06 мая 2018

У меня есть скрипт цикла по pl / sql, мой скрипт вернул заказ по i asc,

DECLARE 
    i NUMBER;
BEGIN
    FOR rec IN (
        SELECT 1 as i from dual
        UNION
        SELECT 2 as i from dual
        UNION
        SELECT 3 as i from dual
        UNION
        SELECT 4 as i from dual
    )
    LOOP
        DBMS_OUTPUT.PUT_LINE (rec.i); 
    END LOOP; 
end;

и он вернулся

1
2
3
4

но мне нужно заказать

1
4
3
2

какую функцию я должен использовать для решения проблемы, спасибо advence

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Вместо использования оператора UNION используйте оператор UNION ALL , поскольку оператор UNION возвращает отсортированный различный результат. С другой стороны UNION ALL оператор return дубликаты несортированные результат

попробуйте следующий запрос: - SET SERVEROUTPUT ON; DECLARE i NUMBER; BEGIN FOR rec IN ( SELECT 1 as i from dual UNION ALL SELECT 4 as i from dual UNION ALL SELECT 3 as i from dual UNION ALL SELECT 2 as i from dual ) LOOP DBMS_OUTPUT.PUT_LINE (rec.i); END LOOP; end; /

0 голосов
/ 06 мая 2018

Как главная начальная контрольная точка интереса для индексации может быть i-1 в порядке по части оператора SQL.

Итак, следующий курсор может быть предпочтительным:

SELECT * FROM
(
 SELECT 1 as i from dual
 UNION
 SELECT 2 as i from dual
 UNION
 SELECT 3 as i from dual
 UNION
 SELECT 4 as i from dual
)
ORDER BY sign(i-1), (i-1) desc;

Демонстрация SQL Fiddle

0 голосов
/ 06 мая 2018

Я ожидаю, что это вернет то, что вы хотите:

DECLARE 
    i NUMBER;
BEGIN
    FOR rec IN (
        SELECT 1 as i from dual
        UNION ALL
        SELECT 4 as i from dual
        UNION ALL
        SELECT 3 as i from dual
        UNION ALL
        SELECT 2 as i from dual
     ) LOOP
        DBMS_OUTPUT.PUT_LINE (rec.i); 
    END LOOP; 
end;

Однако это только потому, что данные небольшие. Oracle не гарантирует порядок наборов результатов без ORDER BY. Поэтому более безопасный метод:

DECLARE 
    i NUMBER;
BEGIN
    FOR rec IN (
        SELECT i
        FROM (SELECT 1 as i, 1 as ord from dual UNION ALL
              SELECT 4 as i, 2 from dual UNION ALL
              SELECT 3 as i, 3 from dual UNION ALL
              SELECT 2 as i, 4 from dual
             ) x
        ORDER BY ord
     ) LOOP
        DBMS_OUTPUT.PUT_LINE (rec.i); 
    END LOOP; 
end;
...