ORA-01722 Invalid Number

UNIVERSAL
Дата: 03.08.2005 16:44:33
Здравствуйте, господа. При ниже приведённом запросе происходит сабж. Причём, если подзапросы отработать отдельно или закомментаренные части раскомментарить, то всё ок. Понимаю, что видимо какие-то значения в строках неправильно преобразуются в число, но какие? и как с этим бороться? В основном работал с MS SQL Server 2000, так что тут я совершенно неопытен, так что сильно не нападайте плз. Причём на MS SQL это всё за милу душу отрабатывает. Помогите пожалуйста советом. Заранее спасибо.
select decode(Dt.OD, null, TO_DATE(Kt.OD), TO_DATE(Dt.OD)) TD 
, Dt.OD DT_DATE, Dt.KT_ACC, sum(Dt.acnt_sum) DT_AMOUNT, Kt.OD KT_DATE,Kt.DT_ACC, sum(Kt.acnt_sum) KT_AMOUNT
 from 
(select TO_CHAR(vo.operation_date) OD ,KtAcc.Acc_Name KT_ACC, vo.acnt_sum from V_OPRSPECS vo 
inner join dicaccs DtAcc on vo.account_debit = DtAcc.acc_number
inner join dicaccs KtAcc on vo.account_credit=KtAcc.acc_number
where (vo.account_debit=5001010000) /*and (vo.operation_date>=to_date('01.06.2005'))*/) Dt
full outer join
(select TO_CHAR(vo.operation_date) OD, DtAcc.Acc_Name DT_ACC,
vo.acnt_sum from V_OPRSPECS vo 
inner join dicaccs DtAcc on vo.account_debit = DtAcc.acc_number
inner join dicaccs KtAcc on vo.account_credit=KtAcc.acc_number
where (vo.account_credit=5001010000) /*and (vo.operation_date>=to_date('01.06.2005'))*/) Kt
on TO_CHAR(decode(Dt.OD,null,Dt.OD,'')) = TO_CHAR(decode(Kt.OD,null,'',Kt.OD))
group by decode(Dt.OD, null, TO_DATE(Kt.OD), TO_DATE(Dt.OD)),Dt.OD, Dt.Kt_Acc, Kt.DT_ACC, Kt.OD
order by TD
Vadim_Maximov
Дата: 03.08.2005 16:48:50
А потом они спрашивают, за что мы так не любим ANSI-синтаксис
beginner111
Дата: 03.08.2005 16:57:16
Во ПАРУС
Щас попробовал запрос говорит что не хватает скобки!!
UNIVERSAL
Дата: 03.08.2005 17:02:10
Да? может я не всё скопировал? вот расккоммиченный код:
select decode(Dt.OD, null, TO_DATE(Kt.OD), TO_DATE(Dt.OD)) TD 
, Dt.OD DT_DATE, Dt.KT_ACC, sum(Dt.acnt_sum) DT_AMOUNT, Kt.OD KT_DATE,Kt.DT_ACC, sum(Kt.acnt_sum) KT_AMOUNT
 from 
(select TO_CHAR(vo.operation_date) OD ,KtAcc.Acc_Name KT_ACC, vo.acnt_sum from V_OPRSPECS vo 
inner join dicaccs DtAcc on vo.account_debit = DtAcc.acc_number
inner join dicaccs KtAcc on vo.account_credit=KtAcc.acc_number
where (vo.account_debit=5001010000) and (vo.operation_date>=to_date('01.06.2005'))) Dt
full outer join
(select TO_CHAR(vo.operation_date) OD, DtAcc.Acc_Name DT_ACC,
vo.acnt_sum from V_OPRSPECS vo 
inner join dicaccs DtAcc on vo.account_debit = DtAcc.acc_number
inner join dicaccs KtAcc on vo.account_credit=KtAcc.acc_number
where (vo.account_credit=5001010000) and (vo.operation_date>=to_date('01.06.2005'))) Kt
on TO_CHAR(decode(Dt.OD,null,Dt.OD,'')) = TO_CHAR(decode(Kt.OD,null,'',Kt.OD))
group by decode(Dt.OD, null, TO_DATE(Kt.OD), TO_DATE(Dt.OD)),Dt.OD, Dt.Kt_Acc, Kt.DT_ACC, Kt.OD
order by TD
только что отработал в PL\SQL develjper-е
UNIVERSAL
Дата: 03.08.2005 17:05:12
Кстати, первоначально join выполнялся по такому условию
on Dt.OD = Kt.OD
это я уже потом эксперементировал
on TO_CHAR(decode(Dt.OD,null,Dt.OD,'')) = TO_CHAR(decode(Kt.OD,null,'',Kt.OD))
VicZai
Дата: 03.08.2005 17:05:53
Полность согласен с Вадимом
beginner111
Дата: 03.08.2005 17:15:58
нехватает правой скобки
ну ладно предположим тоад не знает такой синтакси но sql+ тоже самое говорит
и кстати не понял
автор
Причём на MS SQL это всё за милу душу отрабатывает
UNIVERSAL
Дата: 03.08.2005 17:28:16
2beginner111 ну про MS SQL это я к слову, просто мне легче пока мои знания проецировать на MS SQL и остаётся только сожалеть что я пока такой даун :) чтобы не написать простой запрос на Oracle, который бы на MS SQL уже давно бы отдал в эксплуатацию
UNIVERSAL
Дата: 03.08.2005 17:29:22
2beginner111А со скобкой не пойму... у меня правда всё работает
Bely
Дата: 03.08.2005 17:37:00
Не пойму нескольких вещей.
1) Зачем конвертировать дату в строку, а потом обратно... ну это просто мысли вслух
(select 
  TO_CHAR(vo.operation_date) OD ,
  KtAcc.Acc_Name KT_ACC, vo.acnt_sum from V_OPRSPECS vo 
...

2)
 on TO_CHAR(decode(Dt.OD,null,Dt.OD,''))
   = TO_CHAR(decode(Kt.OD,null,'',Kt.OD))
Приглядитесь к выражению JOIN-а.
Если Dt.OD = NULL, то вернуть Dt.OD (NULL), иначе вернуть пустую строку, т.е. тоже NULL.
Получаем всегда NULL - с условиями напутано