更新DECIMAL值时出现Oracle错误ORA-01722

时间:2011-06-28 15:17:37

标签: oracle10g odp.net

我正在使用ODP更新Oracle 10g数据库而没有成功更新小数值。 例如:

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

结果:var列中的604('。'消失)

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 个答案:

答案 0 :(得分:1)

你没有给我们太多的东西(只有插入语句,而不是类型的铸造或什么不是)

但这是一个测试案例,展示了如何做到这一点。

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 重新投射变量。

答案 1 :(得分:1)

我在发布问题后发现了问题!我没有找到正确的地方...... Oracle更新并不关心。问题出在我用来将输入字符串(包含昏迷作为小数分隔符)转换为十进制数字的Decimal.parse方法(带点作为十进制分隔符)我想在DB中更新。问题在于,我自己的开发计算机上的系统文化与客户端计算机上的系统文化不同,即使它们都在同一个国家/地区运行。然后解析完全在我的计算机上工作,但正在删除客户端生产环境中的小数字符。我终于通过dot实现了“替换”昏迷,现在一切顺利。再次感谢您的时间。