2010-07-13 59 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个单元插入脚本。在此流程中,当我尝试运行脚本时,它会引发运行时错误'堆栈溢出'