如何在调用脚本时通过正则表达式执行sql脚本?

时间:2016-06-23 21:52:42

标签: plsql sqlplus

我有一个带有一些pl / sql代码的sqlplus脚本,它调用一些罐装oracle 12c程序以便进行分区维护 - 那些程序在一个目录中生成一系列sql文件 - 每个文件只是一系列的alter table drop分区语句。目标是然后执行那些生成的sql脚本。生成的sql文件的命名方式不同,但都有一个共同的命名模式:SOA_SYS * .sql

根据我的研究,尝试从实际的plsql代码中调用这些sql脚本似乎不可行或不可取。如果是这样的话,我似乎有3个选择:

  • 从sqlplus脚本中调用sql脚本。是否可以使用sqlplus脚本语言执行此操作并使用正则表达式获取对所有文件的引用,然后迭代它们并使用@ file.sql执行每个文件?或者sqlplus在这方面是否有限?

  • 创建一个运行sql文件的dbms_scheduler作业,并在保证生成文件时安排它。是否可以在dbms_scheduler作业中动态调用多个sql脚本?

  • 在服务器上创建一个cron作业,该脚本执行一个shell脚本,该脚本遍历目录中的sql文件并打开sqlplus以连接每个数据库并通过@ file.sql调用它。

还有其他选择吗?这是实现预期目标的推荐和最简单的方法?感谢。

1 个答案:

答案 0 :(得分:1)

会有很多步骤,但应该可以在PL / SQL中执行此操作。它可以让你更好地控制如何运行语句,但这将是很多工作。

步骤可能是这样的:

  1. 查找动态文件。
  2. 将每个文件加载到CLOB中。
  3. 将CLOB拆分为多个SQL语句并迭代它们。
  4. 对语句进行分类,以确保每个语句都是预期的ALTER语句。
  5. 删除语句终止符,可能是;/。 (这些终结器不能在动态SQL中工作。)
  6. 使用execute immediate运行语句。
  7. 报告状态,包含错误消息或成功的反馈消息,如“表格已更改”。也许将结果存储在某个日志中。
  8. 步骤#1可以通过外部表预处理器shell脚本实现,如this article中所述。第2步可能相当简单,只需致电DBMS_XSLPROCESSOR.READ2CLOB

    根据SQL语句的复杂性,步骤#3到#7可能非常复杂。除非SQL语句非常统一,否则正则表达式不足以处理它。但是我的开源项目plsql_lexer可以处理复杂SQL语句的这些步骤。即使解析了解析,你仍然需要大约100行代码才能处理结果。有关实际示例,请参阅项目自述文件。

    但是,很多更容易控制预制程序,并使它们运行语句而不是将它们写入文件。或至少将它们存放在一张桌子中。我认为这是第三方工具?如果是这样,可能会有一些方法可以让它更好地工作。

    如果你很幸运,这是一个可以修改的PL / SQL程序。他们包裹了吗?别担心,网上有很多不包装的东西。

    如果它正在运行PL / SQL,但您无法访问它,您仍然可以控制它。例如,它可能使用UTL_FILE来写入文件。但我敢打赌,他们并没有完全符合SYS.UTL_FILE的资格。在这种情况下,您可以创建自己的UTL_FILE版本,将数据写入表而不是文件系统。然后在应用程序架构上安装软件包,它将使用新软件包。