2009-05-05 65 views
2

首先有一點背景。我的公司正在評估我們是否將我們的Informix數據庫遷移到Oracle 10g。我們有幾個ESQL/C程序。我已經運行了一些Oracle Migration工作臺,並且通過了一些測試。現在我已經意識到了一些事情。Informix to Oracle:處理獲取空值

首先,我們有沒有處理空值在所有動態SQL語句。從我讀過的內容來看,我必須手動修改查詢來使用nvl()函數或實現指示符變量。有人可以確認是否需要手動修改?我們必須對我們轉換的ESQL/C程序進行的手動更改數量最少。

第二,我們有幾個查詢其拉日期從各種表格等,並在Informix的日期將被視爲long類型時,#自12月31日兩天,1899年

在Pro * C,什麼格式日期被選爲?我知道這不是數字,因爲我嘗試在我的long變量中選擇日期字段,並得到Oracle錯誤,指出「期望的NUMBER,但有一個日期」。所以我假設我們不得不修改我們如何選擇日期字段 - 要麼以轉換的方式選擇日期字段,以便它變得很長(即自12/31/1899以來的天數),或者更改主機變量以匹配Oracle返回的內容(這是什麼,字符串?)。

+0

+1我感到不得不考慮遷移你的痛苦 – 2009-05-05 14:19:12

+0

運氣不好 - 我希望他們決定不爲你着想。動態SQL不處理Informix代碼中的問題是否是問題,還是您的意思是OCI(Pro * C)不能處理帶有主機變量的指示符變量? – 2009-05-05 18:27:42

回答

2

爲了在oracle日期(這是在甲骨文內部格式存儲)轉換成一個長整型,您需要更改您的查詢。使用下面的公式爲您的日期:

to_number (to_char (date_column, 'J')) - to_number(to_char(to_date('12/31/1899', 'MM/DD/YYYY'), 'J')) 

Oracle系統「J」(對於Julian日期)格式是自12月31日,4712BC天數的計數。如果你想從以後的日期算起,你需要減去後一日的儒略日計數。

一個建議:不是改變所有的疑問在你的計劃(可能產生問題和引入錯誤),在不同的模式中創建一組的意見。這些視圖的名稱與所有表的名稱相同,都包含相同的列,但包括NVL()和date()公式(如上所示)。然後將您的應用程序指向視圖模式而不是基表模式。更少的測試和更少的地方丟失東西。

因此,例如,把你所有的表到一個名爲「APPS_BASE」(由用戶「APPS_BASE」然後創建另一個架構/用戶名爲「APPS_VIEWS」在APPS_VIEWS創建一個視圖定義的架構:。

CREATE OR REPLACE VIEW EMP AS 
SELECT name, birth_date 
FROM APPS_BASE.EMP; 
3

雅。您將需要修改您所描述的查詢。

長被絆倒你。在Oracle中長期有不同的含義。有一個特定的DATE類型。通常,在選擇某個格式的TO_DATE函數時,要以VARCHAR2格式獲取結果,格式完全符合您的要求。

3

也許它沒有打你還沒有,但要知道,在甲骨文空的VARCHAR2字段都爲NULL。我看不到這背後的邏輯(可能是因爲我來自Informix的土地) - 請牢記它。我認爲這是愚蠢的 - 恕我直言,空字符串是有意義的,不同於NULL。

要麼修改所有的VARCHAR2字段是NOT NULL DEFAULT '-'或任何其他任意值,或者在您的查詢返回VARCHAR2字段,或者通常使用NVL()使用indicatores。