平台:Windows 7 x-64 数据库:Oracle Database 12c企业版12.1.0.2.0版 - 64位。
Oracle row_limiting_clause
如何用于rowcount | %PERCENT行在Oracle 12c中有效吗?
Oracle row_limiting_clause
行为奇怪。
在下面的代码中,表“fetch_test”有10行
案例1
使用no rows selected
时只获取前0.5行,
1 row as output.
案例2 当使用row_limiting_clause子句时,前5%的行只有
1 row as output.
案例3 当使用row_limiting_clause子句时,只有前1%的行,我得
SQL> select * from fetch_test;
COL1 COL2
---- ----
1 A
2 B
3 C
4 D
5 E
6 F
7 G
8 H
9 I
10 J
10 rows selected.
这意味着案例1!=案例2 [0.5!= 0.5(10行中的5%)]
SQL> select col1 from fetch_test
2 fetch first 0.5 rows only;
no rows selected
案例1:
SQL> select col1 from fetch_test
2 fetch first 5 percent rows only;
COL1
----
1
1 row selected
案例2:
SQL> select col1 from fetch_test
2 fetch first 1 percent rows only;
COL1
----
1
1 row selected
案例3:
{{1}}
Oracle文档的内容,
如果行计数包含分数,则截断小数部分。如果 行计数为NULL,则返回0行 "source"
这解释了案例1,但我在上面的例子中找不到案例2和3的可能解释。 任何帮助将受到高度赞赏。
答案 0 :(得分:1)
你的观察是正确的。严格阅读Oracle文档表明这种行为是正确的:
rowcount case指定分段被截断。
没有提到百分比被截断。因此,可以合理地假设百分比没有被截断。
这似乎是合理的,因为一小部分行没有逻辑意义,但小数百分比确实具有逻辑意义。
使用rowcount指定要返回的行数。 rowcount必须是数字或计算结果为数值的表达式。如果指定负数,则rowcount将被视为0.如果rowcount大于从行offset + 1开始的可用行数,则返回所有可用行。如果rowcount包含分数,则截断小数部分。如果rowcount为NULL,则返回0行。
使用百分比PERCENT指定要返回的所选行总数的百分比。 percent必须是数字或表达式,其值为数值。如果指定负数,则将百分比视为0.如果百分比为NULL,则返回0行。
http://docs.oracle.com/database/121/SQLRF/statements_10002.htm
对于这组特定的数字,我们可以观察到Oracle将10%的10%转为1。
> select 10*.05, round(10*.05) from dual;
10*.05 round(10*.05)
------ -------------
0.5 1
更新,rishabi说明:
余数(在行限制器中使用PERCENT时)将始终返回整数舍入为UP http://community.oracle.com/message/13176927#13176927