如何在调用脚本中通过Regex执行SQL脚本



我有一个带有一些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以连接到DB的每个DB,并通过 @file.sql。

还有其他选项吗?哪种推荐和最简单的实现预期目标的方法?谢谢。

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

这些步骤可能会这样:

  1. 找到动态文件。
  2. 将每个文件加载到一个clob中。
  3. 将clob拆分为多个SQL语句并迭代它们。
  4. 对语句进行分类,以确保每个语句都是预期的ALTER语句。
  5. 删除语句终止器,可能是;/。(这些终结者在动态SQL中无法使用。)
  6. 使用execute immediate
  7. 运行语句
  8. 报告状态,并带有错误消息或成功的反馈消息,例如"表更改"。也许将结果存储在日志中。

步骤#1可以使用外部表格预处理程序shell脚本来实现,如本文所述。步骤#2可能很容易,只需致电dbms_xslprocessor.read2clob。

步骤3至#7可能会非常复杂,具体取决于SQL语句的复杂性。除非SQL陈述非常均匀,否则正则表达式不足以应对。但是我的开源项目plsql_lexer可以处理复杂SQL语句的这些步骤。即使进行了解析,您仍在寻找大约100行代码来处理结果。有关现实的示例,请参见项目读取文件。


但是,它将更容易控制罐头程序,并使它们运行语句而不是将其写入文件。或至少将它们存放在桌子中。我认为这是一些第三方工具?如果是这样,可能有某种方法可以将其改善工作。

如果幸运的话,这是一个可以修改的PL/SQL程序。他们包裹了吗?不用担心,在线上有很多未加工的人。

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

最新更新