我有一个光标,从列中选择日期,其中NUMBER类型包含浮点数。像4,3433这样的数字会正确返回,而小于1的数字会删除前导零。
例如,数字0,4513返回为4513。
当我在数据库中执行游标中使用select时,数字格式正确,前导零。
这就是我循环遍历游标返回的recors的方法:
FOR c_data IN cursor_name(p_date) LOOP
...
END LOOP;
为什么它以这种方式运作的任何想法?
提前谢谢。
答案 0 :(得分:4)
您的数字格式和数字值令人困惑。
当作为数字读取时,两个字符串0.123
和.123
在数学上等于。它们代表相同的数字。在Oracle中,真正的数字表示永远不会直接显示,我们总是将数字转换为字符以隐式显示或explicitly with a function。
您假设介于0和1之间的数字应使用前导0表示,但默认情况下不是这样,这取决于您询问此数字的显示方式。如果您不希望出现意外结果,you have to be explicit显示数字/日期时,例如:
to_char(your_number, '9990.99');
答案 1 :(得分:1)
这是Oracle提供的默认数字格式。 如果要指定自定义的东西,则应使用TO_CHAR函数(在SQL查询或循环内的PL / SQL代码中)。
以下是它的工作原理:
SQL>
SQL> WITH aa AS (
2 select 1.3232 NUM from dual UNION ALL
3 select 1.3232 NUM from dual UNION ALL
4 select 332.323 NUM from dual UNION ALL
5 select 0.3232 NUM from dual
6 )
7 select NUM, to_char(NUM, 'FM999990D9999999') FORMATTED from aa
8 /
NUM FORMATTED
---------- ---------------
1.3232 1.3232
1.3232 1.3232
332.323 332.323
.3232 0.3232
SQL>
在此示例中,'FM' - 抑制额外空白,'0'表示包含前导/尾随零的数字位数,'9'表示抑制前导/尾随零的数字。
您可以在此处找到许多示例: http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34570