【问题标题】:Oracle PL/SQL script generation from excel sheet从 Excel 表生成 Oracle PL/SQL 脚本
【发布时间】:2017-03-11 18:39:55
【问题描述】:

我需要从 Excel 工作表生成插入脚本文件。我部分成功地生成了脚本文件。但是我遇到了一种情况,我需要any1的帮助。

我的逻辑是这样的,读取第一个单元格,检查单元格中的值是否已经存在于数据库中。如果没有,生成如下插入脚本

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

我将 PK1 存储在哈希表中,数据具有 KEY 。因此,如果相同的数据出现在下一行中,使用哈希表搜索,我将获取相应数据键的哈希表值并将其传递给另一个插入脚本。但是每次我生成像 PK1、Pk2 等新变量时。我在 Declare 之后保留“BEGIN”关键字,并在每次插入后添加“END”关键字,如果我这样做,变量的范围就会超出范围。我可能在另一个插入语句中使用那些声明的变量有一个参数。是否有机会保存 PK1,Pk2 ..... 有脚本执行的会话/全局变量。因此它们将在整个脚本执行时间内可用。

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    我倾向于说电子表格的每一行都应该创建一个类似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,然后将它们复制并粘贴到块中的正确位置。

    【讨论】:

    • 每个单元格都会生成插入脚本到相应的表中。我使用上述技术,问题是,如果我需要在单元格(10,10)的插入脚本中的某个位置使用 PK1 变量,因为我们在 Begin 块之后立即结束“结束”,PK1 的范围始终保留在 Begin 块中。Scope PK1 LOst。为此,我创建了一个插入开始,然后创建另一个插入开始,依此类推,@结束 im添加结束;结束;但上述方法的问题是,我正在尝试插入 400 个单元格插入脚本。在这个流程中,当我尝试运行脚本时,它会引发运行时错误“堆栈溢出”
    【解决方案2】:

    我会从一个开始

    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;
    

    操作过程可以随心所欲,将信息存储在表格/数组中。

    【讨论】:

      【解决方案3】:

      问题是从电子表格更新数据库的最佳方式,还是从电子表格生成脚本的最佳方式?

      我建议将电子表格数据加载到临时表中,然后使用简单的 INSERT/SELECT 语句,除非您担心唯一性冲突,在这种情况下我会使用 MERGE 语句。这比尝试为每个插入语句生成带有逻辑的脚本要容易得多。

      【讨论】:

        【解决方案4】:

        而不是每一行,将其视为每个单元格。每个单元格都会生成插入脚本到相应的单元格中。我以同样的方式创建,问题是如果我想在第 10 行、第 10 列(单元格值)插入脚本的某个位置使用 PK1 变量,因为我们在 Begin 块之后立即结束“结束”,PK1 的范围总是保持在开始块中。为此,我创建了一个插入开始,然后创建另一个插入开始,依此类推。@结束我添加结束;结束;但上述方法的问题是,我正在尝试插入 200 行 X 200 列 = 400 个单元格插入脚本。在这个流程中,当我尝试运行脚本时,它会引发运行时错误“堆栈溢出”

        【讨论】:

          【解决方案5】:

          如果您使用 Oracle E-Business,您可能会对 webadi 感兴趣。

          此工具创建一个要填充的 excel 文件,然后通过程序加载到数据库中。然后您可以验证您的数据。

          Creating custom Web ADI Integrators
          WebADI - Using a Custom Integrator

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-03-31
            • 2010-12-21
            • 1970-01-01
            • 2013-05-25
            • 2012-04-19
            • 1970-01-01
            • 1970-01-01
            • 2011-08-17
            相关资源
            最近更新 更多