根据我的研究,尝试从实际的plsql代码中调用这些sql脚本似乎不可行或不可取。如果是这样的话,我似乎有3个选择:
从sqlplus脚本中调用sql脚本。是否可以使用sqlplus脚本语言执行此操作并使用正则表达式获取对所有文件的引用,然后迭代它们并使用@ file.sql执行每个文件?或者sqlplus在这方面是否有限?
创建一个运行sql文件的dbms_scheduler作业,并在保证生成文件时安排它。是否可以在dbms_scheduler作业中动态调用多个sql脚本?
在服务器上创建一个cron作业,该脚本执行一个shell脚本,该脚本遍历目录中的sql文件并打开sqlplus以连接每个数据库并通过@ file.sql调用它。
还有其他选择吗?这是实现预期目标的推荐和最简单的方法?感谢。
答案 0 :(得分:1)
会有很多步骤,但应该可以在PL / SQL中执行此操作。它可以让你更好地控制如何运行语句,但这将是很多工作。
步骤可能是这样的:
ALTER
语句。;
或/
。 (这些终结器不能在动态SQL中工作。)execute immediate
运行语句。步骤#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
版本,将数据写入表而不是文件系统。然后在应用程序架构上安装软件包,它将使用新软件包。