2016-06-23 41 views
1

我有一些pl/sql代码,它调用一些罐装oracle 12c程序以执行分区维护 - 这些程序在目录中生成一系列sql文件 - 每个文件只是一系列alter table drop分区声明。目标是然后执行那些生成的sql脚本。生成的sql文件全都命名不同,但都有一个共同的命名模式:SOA_SYS * .sql如何在调用脚本中通过正则表达式执行sql脚本?

从我研究的内容来看,尝试从实际的plsql代码中调用这些sql脚本似乎并不可行或不可取。如果是这样,似乎我有3个选项:

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

  • 创建一个dbms_scheduler作业,该作业运行sql文件并计划在保证生成文件时进行调度。是否可以在dbms_scheduler作业中动态调用多个sql脚本?

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

还有其他的选择吗?推荐和最简单的方法来达到预期的目标是什么?谢谢。

+0

是否需要创建脚本 - 是否可以运行您正在动态添加的命令?否则,你能创建一个主脚本来调用其他脚本,而不需要列表或正则表达式吗? –

回答

1

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

的步骤可能会去是这样的:

  1. 找到动态文件。
  2. 将每个文件加载到CLOB中。
  3. 将CLOB拆分为多个SQL语句并对它们进行迭代。
  4. 对报表进行分类,以确保每个报表都是预期的ALTER报表。
  5. 删除语句终止符,可能是;/。 (这些终结器不能在动态SQL中工作。)
  6. 运行语句execute immediate
  7. 报告状态,并显示错误消息或成功反馈消息,如“表已更改”。也许将结果存储在某个地方的日志中。

步骤#1可以用外部表格预处理器外壳脚本实现,例如this article中所述。步骤#2可能相当简单,只需拨打DBMS_XSLPROCESSOR.READ2CLOB即可。

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


但它会容易采取的罐装过程控制,并使其运行报表,而不是将其写入到文件中。或者至少将它们存储在桌子上。我认为这是一些第三方工具?如果是这样,那么可能有某种方法可以使其更好地工作。

如果幸运的话,这是一个可以修改的PL/SQL程序。他们包裹了吗?别担心,网上有大量的un-wrappers。

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