2012-12-12 85 views
1

我正嘗試使用Toad將Excel電子表格導入Oracle。問題在於我導入的表有一個主鍵字段,我使用「sequence」.nextval來填充正常的存儲過程插入。我嘗試把'table_seq.nextval'作爲表達式放入,但是當我在最後執行嚮導時出現錯誤:無法將類型(UnicodeString)的變體轉換爲類型(Double) 。使用Toad將Excel電子表格導入到Oracle

那麼是否有可能使用帶有Toad導入嚮導的sequence.nextval導入Excel數據,或者有更好的方法嗎?

我也給了一些想法,讓Excel通過開始超出當前表中的種子來生成密鑰。但是對於Oracle而言,這是否會破壞我爲表格設置的順序?例如,如果在插入之前,下一個可用的ID是500,而Excel的插入插入的行是500到5000,那麼下一次執行該表序列的存儲過程時是否會嘗試使用500?

在此先感謝!

回答

4

是的,序列將保持在50,並且在使用存儲過程時會遇到primary key violated異常。

這是因爲序列沒有以任何方式鏈接到表。並且不能被鏈接。他們是分開的對象。

我看到的最佳方法是使用觸發器on insert for each row,它將ID設置爲nextval

代碼示例:

CREATE OR REPLACE TRIGGER trg_table_name_set_id 
    BEFORE INSERT 
    ON table_name 
    FOR EACH ROW 
BEGIN 

    SELECT table_seq.nextval INTO :new.id FROM DUAL; --id would be the id column in your table 

--or, if you are on 11g, simply 
--:new.id := table_seq.nextval; 

END trg_table_name_set_id; 
+0

我想到這個問題,但也不會我需要更新我的所有存儲過程,除去從嵌入式.nextval聲明? – indianapolymath

+0

您可以在將序列值分配給觸發器之前檢查:new.id是否爲空。這將允許您的存儲過程保持不變。 – GriffeyDog

+0

indianapolymath,這不會是一個真正的問題。對於每條記錄,該順序將被提取兩次,並且只有來自觸發器的順序將保留在表中,因爲觸發器將覆蓋該過程。但@griffeydog是正確的,你可以檢查觸發器:new.id爲null,然後從序列中分配值。但是:我建議你只有一個地方給id賦值,這在這種情況下是觸發器。 –

相關問題