【问题标题】:Oracle error ORA-01722 while updating DECIMAL value更新 DECIMAL 值时出现 Oracle 错误 ORA-01722
【发布时间】:2012-07-08 06:17:29
【问题描述】:

我正在使用 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 函数,但没有成功。 关于我应该使用的正确格式有什么想法吗?

谢谢。

【问题讨论】:

    标签: oracle10g odp.net


    【解决方案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 重新转换变量。

    【讨论】:

    • 非常感谢您的快速回复。
    【解决方案2】:

    我在发布我的问题后发现了问题!我没有看对地方...... Oracle 更新根本不关心。问题出在我用来将输入字符串(包含逗号作为小数分隔符)转换为我想在数据库中更新的十进制数(以点作为小数分隔符)的 Decimal.parse 方法中。问题是我自己的开发计算机上的系统文化与客户端计算机上的不同,即使它们都在同一个国家/地区运行。然后解析在我的计算机上完美运行,但在客户端生产环境中删除了十进制字符。我终于把一个“替换”昏迷放在了一个地方,现在一切都很顺利。再次感谢您的宝贵时间。

    【讨论】:

      猜你喜欢
      • 2019-08-20
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多