2013-09-19 3 views
0

У меня есть указатель, который выбирает дату из столбца с типом числа NUMBER, содержащим числа с плавающей запятой. Номера, например 4,3433, возвращаются должным образом, в то время как числа, меньшие, чем 1, удаляют ведущий ноль.Курсор Oracle удаляет начальный ноль

Например, номер 0,4513 возвращается как, 4513.

Когда я выполняю выбор, используемый в курсоре базы данных, цифры отформатированы правильно, с ведущими нулями.

Это, как я цикл по recors возвращаемых курсором:

FOR c_data IN cursor_name(p_date) LOOP 

... 

END LOOP; 

Любые идеи, почему это работает именно так?

Заранее спасибо.

ответ

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

4

Вы вводите в заблуждение формат номера и числовое значение.

Две строки 0.123 и .123, считанные как число, математически равны. Они представляют одинаковое число. В Oracle истинное числовое представление никогда не отображается напрямую, мы всегда конвертируем число в символ, чтобы отобразить его, либо неявно, либо explicitly with a function.

Предполагается, что число от 0 до 1 должно быть представлено ведущим 0, но по умолчанию это неверно, это зависит от того, как вы запрашиваете этот номер для отображения. Если вы не хотите, неожиданный результат, you have to be explicit при отображении номера/даты, например:

to_char(your_number, '9990.99'); 
Смежные вопросы