【问题标题】:Running a large oracle SQL script in a loop循环运行大型 oracle SQL 脚本
【发布时间】:2017-03-26 05:58:28
【问题描述】:

我创建了一大段脚本,它在我的目标表的最后插入新行。

脚本包含许多选择语句和临时表。

我想循环它以连续运行 2000 次,除了将 f5 推 2000 次之外没有其他选择。

是否有相当于将代码包装到 SAS 宏中并循环 2000 次的 Oracle SQL?

【问题讨论】:

  • Oracle 有一个FOR 循环,就像大多数编程语言一样。检查文档或here
  • @EdGibbs - Oracle SQL 并不是您所说的“编程语言”。 SQL 中一般没有 FOR 循环,尤其是 Oracle 中。相反,Oracle 与其他数据库一样,具有紧密集成的过程语言 PL/SQL。您的文档链接指向 PL/SQL 中的 FOR 循环,而不是 Oracle SQL。
  • 您搜索了什么?我刚刚在 Google 上搜索了“在 SAS 脚本中包装 Oracle SQL”,据我所知,有一些解决方案可供了解 SAS 的人使用。
  • 如果你走 PL/SQL 路线,你可能会发现你的临时表可以被集合替换;尽管它们的存在有点令人不安——如果您将它们创建为脚本的一部分(我当然是在疯狂地推测),这通常是一个坏主意,并且如果您打算继续这样做,会迫使您使用动态 SQL。希望你不是。通过 SQL*Plus 循环和运行脚本的 shell 或批处理脚本可能更简单。或者,也许您可​​以重构为完成所有工作的单个插入,也许使用 CTE,但再次推测您现在正在做什么。
  • PL/SQL 在这里可能会有所帮助。但是,在脚本末尾有许多选择、临时表和插入语句,这听起来很奇怪。我并不是说从来没有必要这样做,但它非常罕见,而且听起来更像是一种批处理文件处理,而不是使用结构良好的数据库。可能值得告诉我们您的脚本正在做什么以获得一些建议。

标签: sql oracle sas


【解决方案1】:

您可以尝试将插入语句转换为纯 SQL 吗?这是加载大量数据的最快和最干净的方法。

设置完成后,可以通过对结果集进行笛卡尔乘积来生成 row_source。

例如:最初假设您的表有以下内容

EmpNo, EmpName, Sal
1000 , Mark   , 500
1001 , Jorja  , 100

我希望生成表格的内容 3 次,然后我会执行以下操作

insert into emp
select (select max(empno) 
          from emp
       )+lvl as empNo
      , empName
      , Sal
  from emp
  join (select level as lvl
          from dual
        connect by level<=3
        )row_source_generation
    on 1=1;

这将给出以下输出

EmpNo, EmpName, Sal
1000 , Mark   , 500
1001 , Jorja  , 100
1002 , Mark1  , 500
1003 , Jorja1 , 100
1004 , Mark2  , 500
1005 , Jorja2 , 100
1006 , Mark3  , 500
1007 , Jorja3 , 100

【讨论】:

    【解决方案2】:

    PL/SQL 匿名块最适合这种情况:

    BEGIN
        FOR i IN 1..2000 LOOP
            -- Insert scripts go here
        END LOOP
    END;
    /
    

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 2012-05-31
      • 2020-09-20
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      相关资源
      最近更新 更多