oracle循环排序
oracle loop ordering
我有 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
我希望这 return 你想要什么:
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;
而不是使用 UNION 运算符使用 UNION ALL 运算符因为 UNION 运算符 return 排序不同 结果。另一方面 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;
/
As 索引的主要起始参考点可能是 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;
我有 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
我希望这 return 你想要什么:
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;
而不是使用 UNION 运算符使用 UNION ALL 运算符因为 UNION 运算符 return 排序不同 结果。另一方面 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;
/
As 索引的主要起始参考点可能是 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;