2010-07-13 98 views
1

我有要求從Excel表生成插入腳本文件。我部分成功地生成腳本文件。但是我遇到了一個情況,我需要任何幫助。從excel表生成Oracle PL/SQL腳本

我的邏輯是這樣的一些東西,讀第一個單元格,檢查是否在單元格中值DB.If已經存在不是,生成插入腳本如下

declare 
    PK1 integer; 
begin 
    select tablename_seq.currval into PK1 from dual; 
    insert into TableName valuestablename_seq_seq.nextval,'Blagh',1); 
end; 

林存儲PK1在哈希表與數據具有KEY。因此,如果相同的數據出現在下一行中,使用Hashtable搜索,我將獲取相應數據鍵的哈希表值,並將其參數傳遞給另一個插入腳本。但每次我生成新的變量,如PK1,Pk2等等。我在Declare之後保留了'BEGIN'關鍵字,並且在每次插入之後還添加了'END'關鍵字,如果我這樣做的話,變量的作用域就會退出範圍。我可能會在另一個插入語句中使用那些聲明的變量有一個參數。是否有保存PK1,Pk2 .....有會話/全局變量的腳本執行的機會。所以他們將成爲整個腳本執行時間的可用者。

回答

2

我的傾向是說,你的電子表格中的每一行應該只創造一個像insert into TableName values (tablename_seq_seq.nextval,'Blagh',1) returning ID into PK1;一份聲明,然後包裹整個事情與相應的變量一個DECLARE-BEGIN-END塊中定義的,是這樣的:

declare 
    pk1 integer; 
    pk2 integer; 
begin 
    insert into TableName 
     values (tablename_seq_seq.nextval,'Blagh',1) 
     returning ID into PK1; 
    insert into TableName 
     values (tablename_seq_seq.nextval,'Urgh',2) 
     returning ID into PK2; 
    [...] 
end; 

您甚至可以在一列中創建變量聲明的列表,並在另一列中創建SQL的列表,然後將它們複製並粘貼到塊中的正確位置。

+0

每個小區將產生插入腳本成對應table.I使用上面TECHNIC,問題是,如果我需要使用PK1可變一些其中在Cell(10,10)的插入腳本,因爲我們在Begin塊之後立即結束'end',所以PK1的範圍總是保留在Begin block.Scope PK1 LOst中。爲此,我創建了一個Insert,然後創建另一個Begin與另一個Insert等等和@結束即時增加結束;結束;但上述方法的問題是,我試圖插入400個單元插入腳本。在此流程中,當我嘗試運行腳本時,它會引發運行時錯誤'堆棧溢出' – user145610 2010-07-14 06:21:48

0

問題是從電子表格更新數據庫的最佳方法,還是從電子表格生成腳本的最佳方法?

我建議將電子表格數據加載到臨時表中,然後使用簡單的INSERT/SELECT語句,除非您擔心唯一性衝突,在這種情況下我會使用MERGE語句。這比試圖爲每個插入語句生成具有邏輯的腳本要容易得多。

1

我開始用

DECLARE 
    PROCEDURE action (p_val IN INTEGER) IS 
    ... 
    END action; 
BEGIN 

然後在電子表格中的每一行只是做一個調用程序,使1電子表格條目變成

action (1); 

然後你結束與類似的東西

DECLARE 
    PROCEDURE action (p_val IN INTEGER) IS 
    ... 
    END action; 
BEGIN 
    action (1); 
    action (8); 
    action (23); 
    action (1); 
    action (1); 
END; 

行動程序可以像你喜歡的那樣複雜,存儲我在表/數組中的任何信息。

0

而不是每一行,考慮爲每個單元格。每個單元格將生成插入腳本到相應的單元格。我以同樣的方式創建,問題是如果我想使用PK1變量某些地方在第10行第10列(單元格值)插入腳本,因爲我們在Begin塊之後立即結束'end',PK1的範圍始終留在Begin塊。爲此,我創建了一個插入開始,然後創建另一個開始與另一個插入等等.and @ end im添加結束;結束;但上述方法的問題是,我trrying以插入200行X 200列= 400個單元插入腳本。在此流程中,當我嘗試運行腳本時,它會引發運行時錯誤'堆棧溢出'