首页 文章

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

提问于
浏览
1

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

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

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

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

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

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

1 回答

  • 1

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

    步骤可能是这样的:

    • 查找动态文件 .

    • 将每个文件加载到CLOB中 .

    • 将CLOB拆分为多个SQL语句并迭代它们 .

    • 对语句进行分类,以确保每个语句都是预期的 ALTER 语句 .

    • 删除语句终止符,可能是 ;/ . (那些终结器不能在动态SQL中工作 . )

    • 使用 execute immediate 运行语句 .

    • 报告状态,包含错误消息或成功的反馈消息,如"Table altered."也许将结果存储在某个日志中 .

    可以使用外部表预处理器shell脚本来实现步骤#1,如this article中所述 . 步骤#2可能相当简单,只需调用DBMS_XSLPROCESSOR.READ2CLOB即可 .

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


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

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

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

相关问题