2014-01-15 2 views
0
SELECT sum((DECODE(transaction_code,'INV',quantity,((-1)* quantity)))) total 
     FROM INVENTORY_TRANSACTION_HIST_TAB 
     WHERE order_no = 9999; 

возвращается: 1160721PL/SQL - другое значение

в PL/SQL блок

declare 
    cursor c is  
     SELECT sum((DECODE(transaction_code,'INV',quantity,((-1)* quantity)))) total 
     FROM INVENTORY_TRANSACTION_HIST_TAB 
     WHERE order_no = 9999         
begin 
    for rec_ in c loop 
    dbms_output.put_line(rec_.total_consumed); 
    end loop; 
end; 

возвращает: 1160720,999999999999995

Любые идеи? Как это исправить?

ответ

0

Предположительно, вы хотите, чтобы это округлялось до соответствующего значения.

Возможно, самый простой способ, чтобы бросить это в десятичное:

SELECT cast(sum((DECODE(transaction_code,'INV',quantity,((-1)* quantity)))) as decimal(15, 2) as total 
FROM INVENTORY_TRANSACTION_HIST_TAB 
WHERE order_no = 9999; 
2

Вы получите тот же результат, когда вы делаете это одно в Sqlplus:

SET NUMWIDTH 50; 

SELECT sum((DECODE(transaction_code,'INV',quantity,((-1)* quantity)))) total 
     FROM INVENTORY_TRANSACTION_HIST_TAB 
     WHERE order_no = 9999; 

Причина находится на Sqlplus в по умолчанию Формат нубмера - SET NUMWIDTH 10, поэтому результат округляется до 10 цифр по умолчанию.

В вашем блоке PL/SQL вы ничего не крутите. Некоторое время назад у меня была такая же проблема, и я получил ответ от Tom Kyte.

+0

Спасибо :) Вы спасли мне много работы! –

Смежные вопросы