我想编写一个接受绑定变量(例如:NUM)的SQL查询,其输出包含一列&:NUM行数,每行包含行号.即如果我们传递:NUM为7,则输出应为:
VAL
====
1
2
3
4
5
6
7
Run Code Online (Sandbox Code Playgroud)
查询中不应该有任何实际的DB表,也不应该使用PL/SQL代码.即在查询中只应使用dual
有没有办法实现这个目标?
OMG*_*ies 34
你可以使用:
WHERE ROWNUM <= :NUM
Run Code Online (Sandbox Code Playgroud)
...但是表必须包含与bind变量中的限制相等或更大的行. 此链接演示了Oracle中的各种行号生成技术.
使用CONNECT BY
Oracle 10g +:
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= :NUM
Run Code Online (Sandbox Code Playgroud)
确认monojohnny
可以使用绑定变量.虽然CONNECT BY
支持语法,但尝试在Oracle 9i上运行会导致ORA-01436错误.
我不是百分之百唯一的事情是CONNECT BY是否接受绑定变量的限制.
参考:
尝试类似的方法:
SELECT 1 AS Val FROM dual
UNION ALL SELECT 2 FROM dual
UNION ALL SELECT 3 FROM dual
UNION ALL SELECT 4 FROM dual
UNION ALL SELECT 5 FROM dual
UNION ALL SELECT 6 FROM dual
UNION ALL SELECT 7 FROM dual;
Run Code Online (Sandbox Code Playgroud)
虽然很乱,但它会起到作用。
编辑:啊 - 你需要传递一个变量来让你知道要走多高......
那么像这样的事情怎么样:
SELECT t1.Val + t2.Val * 2 + t3.Val * 4 + t4.Val * 8 AS Val
FROM
(
SELECT 0 AS Val FROM dual
UNION ALL SELECT 1 FROM dual
) AS t1,
(
SELECT 0 AS Val FROM dual
UNION ALL SELECT 1 FROM dual
) AS t2,
(
SELECT 0 AS Val FROM dual
UNION ALL SELECT 1 FROM dual
) AS t3,
(
SELECT 0 AS Val FROM dual
UNION ALL SELECT 1 FROM dual
) AS t4
WHERE t1.Val + t2.Val * 2 + t3.Val * 4 + t4.Val * 8 <= 7;
Run Code Online (Sandbox Code Playgroud)
好的...再次编辑,现在使用WITH:
WiTH
A0 AS (SELECT 0 as N FROM DUAL UNION ALL SELECT 0 FROM DUAL),
A1 AS (SELECT 0 as N FROM A0, A0 AS B),
A2 AS (SELECT 0 as N FROM A1, A1 AS B),
A3 AS (SELECT 0 as N FROM A2, A2 AS B),
A4 AS (SELECT 0 as N FROM A3, A3 AS B),
A5 AS (SELECT 0 as N FROM A4, A4 AS B),
A6 AS (SELECT 0 as N FROM A5, A5 AS B),
Nums AS (SELECT ROW_NUMBER() OVER (ORDER BY N) AS Val FROM A6)
SELECT *
FROM Nums
WHERE Val <= :NUM
;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
48138 次 |
最近记录: |