Ошибка Oracle ORA-01722 при обновлении значения DECIMAL - PullRequest
0 голосов
/ 28 июня 2011

Я использую ODP для обновления базы данных Oracle 10g, но не удалось обновить десятичные значения.Пример:

UPDATE usertable.fiche SET DT_MAJ = '20110627',var = 60.4 WHERE NB = '2143'

Результат: 604 в столбце var ('.' Исчезает)

UPDATE usertable.fiche SET DT_MAJ = '20110627',var = 60,4 WHERE NB = '2143'

Результат: недействительный номер

UPDATE usertable.fiche SET DT_MAJ = '20110627',var = ‘60,4’ WHERE NB = '2143'

Результат: недействительный номер

Я также пытался использовать функцию TO_NUMBER без какого-либо успеха.Любая идея о правильном формате я должен использовать?

Спасибо.

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Я нашел проблему сразу после публикации моего вопроса !!!Я не смотрел в нужном месте ... Обновление Oracle вообще не касалось.Проблема была в методе Decimal.parse, который я использовал для преобразования входной строки (содержащей запятую в качестве десятичного разделителя) в десятичное число (с точкой в ​​качестве десятичного разделителя), которую я хотел обновить в БД.Дело в том, что системная культура на моем компьютере разработки не такая, как на клиентском компьютере, даже если они оба работают в одной стране.Тогда анализ отлично работал на моем компьютере, но удалял десятичный знак в производственной среде клиента.В конце концов, я просто установил "заменить" кому на точку, и теперь все идет хорошо.Еще раз спасибо за ваше время.

1 голос
/ 28 июня 2011

Вы не дали нам многого, чтобы продолжить (только операторы вставки, не приведение типов или что-то еще)

, но вот тестовый пример, который показывает, как это сделать.

create table numTest(numA number(3) ,
                     numB number(10,8) ,
                     numC number(10,2) )
/                     

--test insert
insert into numTest(numA, numB, numC) values (123, 12.1241, 12.12)
/

select * from numTest
/

/*
NUMA                   NUMB                   NUMC                   
---------------------- ---------------------- ---------------------- 
123                    12.1241                12.12  
*/

--delete to start clean
rollback
/
/*by marking these table.col%type we can change the table type and not have to worry about changing these in the future!*/
create or replace procedure odpTestNumberInsert(
                                     numA_in IN numTest.numA%type ,
                                     numB_in IN numTest.numB%type ,
                                     numC_in IN numTest.numC%type)
AS
BEGIN
    insert into numTest(numA, numB, numC) values (numA_in, numB_in, numC_in) ;
END odpTestNumberInsert ;
/



begin
    odpTestNumberInsert(numA_in => 10 
                       ,numB_in => 12.55678
                       ,numC_in => 13.13);
    odpTestNumberInsert(numA_in => 20 
                       ,numB_in => 30.667788
                       ,numC_in => 40.55);                       

end ;

/

select *
  from numTest
/

/*
NUMA                   NUMB                   NUMC                   
---------------------- ---------------------- ---------------------- 
10                     12.55678               13.13                  
20                     30.667788              40.55 
*/

rollback
/

хорошо, поэтому мы создали таблицу, получили в нее данные (удалили ее), создали процедуру для проверки ее работы (затем откат изменений) и все выглядит хорошо.Итак, давайте перейдем к стороне .net (предположим, C #)

   OracleCommand cmd = new OracleCommand("odpTestNumberInsert", con);
  cmd.CommandType   = CommandType.StoredProcedure;
  cmd.BindByName = true;

  OracleParameter oparam0 = cmd.Parameters.Add("numA_in", OracleDbType.Int64);
  oparam0.Value = 5 ;
  oparam0.Direction = ParameterDirection.Input;

  decimal deciVal = (decimal)55.556677;
  OracleParameter oparam1 = cmd.Parameters.Add("numB_in", OracleDbType.Decimal);
  oparam1.Value = deciVal ;
  oparam1.Direction = ParameterDirection.Input;


  OracleParameter oparam2 = cmd.Parameters.Add("numC_in", OracleDbType.Decimal);
  oparam2.Value = 55.66 ;
  oparam2.Direction = ParameterDirection.Input;

  cmd.ExecuteNonQuery ();

     con.Close();
    con.Dispose();

А затем закончим:

select *
  from numTest
/

NUMA                   NUMB                   NUMC                   
---------------------- ---------------------- ---------------------- 
5                      55.556677              55.66   

все наши данные были вставлены.

Не имея больше кода с вашей стороны, я бы порекомендовал вам проверить, что правильный параметр передается и ассоциируется.на вставку.вышеприведенное доказывает, что это работает.

Вы Не должны повторно преобразовать ваши переменные с помощью TO_NUMBER , когда вы можете сделать это при создании параметров.

...