2011-06-28 23 views
0

我正在使用ODP更新Oracle 10g數據庫,但未成功更新小數值。 例:更新DECIMAL值時Oracle錯誤ORA-01722

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函數而沒有任何成功。 關於我應該使用的正確格式的任何想法?

謝謝。

回答

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 

我們所有的數據的插入。

您的部分沒有更多的代碼我會建議您驗證正確的參數傳入和assoc。插入。上述證明它的工作。

不應通過TO_NUMBER重新投下您的變量時,你可以在創建參數時這樣做。

+0

非常感謝您的快速回復。 – Emmanuel

1

我在發佈我的問題後發現問題!我沒有看到正確的地方......甲骨文的更新並不關心。問題出在我用來將輸入字符串(包含逗號作爲十進制分隔符)轉換爲十進制數(帶點作爲十進制分隔符)的Decimal.parse方法中,我想在數據庫中進行更新。問題在於,我的開發計算機上的系統文化與客戶端計算機上的系統文化不盡相同,即使它們都運行在同一個國家/地區。然後解析完全在我的電腦上工作,但刪除客戶端生產環境中的小數字。我終於用點來代替昏迷,現在一切都進展順利。感謝你的寶貴時間。