2011-12-16 52 views
1

我試圖將一些Informix ESQL轉換爲Oracle Pro * C。在現有的Informix代碼中,「SERIAL」數據類型用於指示自動遞增列。根據Oracle文檔,用於Informix的Oracle遷移工作臺應該能夠處理這個問題,並解釋說它將「SERIAL」數據類型轉換爲帶有關聯的Oracle序列和觸發器的「NUMBER」。但是,當試圖運行該工具時,它只是用「錯誤(序列)」替換「SERIAL」一詞,所以我一直試圖手動添加觸發器/序列。Informix「序列化」Oracle數據庫/序列/觸發器Pro * C

他們的例子在這裏:http://docs.oracle.com/html/B16022_01/ch2.htm#sthref112顯示了一個這樣做的方法。該序列似乎想創建這樣一個觸發器時是相當簡單的,但是:

CREATE TRIGGER clerk.TR_SEQ_11_1 
BEFORE INSERT ON clerk.JOBS FOR EACH ROW 
BEGIN 
SELECT clerk.SEQ_11_1.nextval INTO :new.JOB_ID FROM dual; END; 

的PRO * C預拿起這裏的「創建」關鍵字,並決定我不能使用主機變量「:new.JOB_ID」,因爲主機變量不能與「CREATE」語句一起使用。

我的問題是,有沒有辦法創建一個將Oracle序列鏈接到特定列而不使用主變量來指定列名稱的觸發器? Oracle文檔似乎表明他們的遷移工具應該能夠應付,這意味着必須有某種方式來做到這一點。然而,我發現所有使用觸發器的例子都使用了導致預處理器投訴的主機變量。

謝謝你的時間。

(注:我已經在上面的例子中,Oracle文檔中的示例中使用的觸發/順序/列名)

+0

爲什麼不用SQL腳本創建觸發器?我從C程序中看不到需要這樣做。 – 2011-12-16 16:33:26

回答

1

我設法通過使用「EXEC SQL EXECUTE立竿見影」來解決問題聲明。

char sql_buf[4096+1]; 
snprintf(sql_buf, 4096, <sql>); 
EXEC SQL IMMEDIATE :sql_buf; 

這繞過預處理器,因此允許通過沒有抱怨的聲明。

0

無法使用「主機變量」指定列名稱來創建將Oracle序列鏈接到特定列的觸發器。順便說一下,它不是「主機變量」 - 只是參考。例如,同樣的觸發器可能觸發更新和插入,因此您必須指定您所引用的內容:新變量或舊變量。您可以在MS-SQL中執行,但不能在Oracle中執行。