如何执行目录中的所有 pl/sql 文件(install_db 脚本)

Posted

技术标签:

【中文标题】如何执行目录中的所有 pl/sql 文件(install_db 脚本)【英文标题】:How to execute all pl/sql files in a directory (install_db script) 【发布时间】:2014-06-13 15:58:48 【问题描述】:

我正在尝试实现本文所说的:http://www.rwijk.nl/AboutOracle/psdua.pdf

(简而言之,我在 'myApp/tables/'、'myApp/priviledges/'、'myApp/sequences/' 目录中创建了数据库对象,例如表、权限、序列、索引等...我想执行这些文件来安装我的数据库)。

有一个看起来像 install_db.sql 脚本 p11-12 的示例,但 sql 文件的执行是硬编码的:

@@&tables_path.SCA_OPNAMES.sql 
@@&tables_path.SCA_METERSTANDEN.sql
@@&sequences_path.SCA_MSD_SEQ1.sql
@@&sequences_path.SCA_ONE_SEQ1.sql
@@&indexes_path.MSD_ONE_FK1_I.sql
@@&privs_path.privileges.sql &SCHEMAPREFIX

我希望执行给定目录中的所有文件,但这似乎很棘手。

有一篇不错的帖子可以获取目录中的文件列表:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:439619916584,它运行良好。

所以此时,我有一个临时表中的文件列表,现在我想执行这些文件。

令人惊讶的是,我坚持这一步。 我想做这样的事情:

for tab in (select filename from dir_list) loop
    @tab.filename;
end loop;

但它不起作用,因为我不在 pl/sql 过程中。我可以从 pl/sql 过程执行文件吗?答案对我来说不是很清楚,我阅读了这个问题的相反答案。

感谢您的帮助,

【问题讨论】:

不,you can't mix an SQLPlus @ with a PL/SQL block。 IMO,您应该维护要运行的文件的主脚本;首先,您必须按顺序运行一些事情,例如在引用它们的主键之前创建具有主键的表,而这很难动态地完成。例如,如果您可以使用文件命名约定来解决这个问题,并且真的不想维护主脚本,那么您可以从 shell 脚本构建主脚本,然后将其提交给 SQLPlus。我认为你不能在 SQL*Plus 中做到这一点。 如果你已经在使用java构建列表,难道不能使用java构建并执行命令行运行吗?我从未在 oracle 中从 java 中尝试过它,但我知道它适用于“普通”java。 This 应该告诉你怎么做。 Oracle 没有运行数据库安装/更新脚本的工具。要么自己编写,要么使用现成的解决方案,如 Flyway。 几个月后,我明白了解决方案:为正确的工作使用正确的工具! SQL 和 PLSQL 的目的不是遍历目录中的文件......如果你被困在使用工具做简单的事情,也许它不是一个好工具。我选择使用 ANT 来构建我的安装脚本,我认为它更合适。 【参考方案1】:

您可以尝试使用动态 PL/SQL。 例如,编写一个 PL/SQL 过程,它将 - 将文件的内容读入一个变量,然后 - 使用 EXECUTE IMMEDIATE 动态 SQL 构造执行 PL/SQL。

【讨论】:

以上是关于如何执行目录中的所有 pl/sql 文件(install_db 脚本)的主要内容,如果未能解决你的问题,请参考以下文章

使用 PL/SQL 列出指定目录中的文件

如何使用参数从 Oracle PL/SQL 执行 Java jar 文件?

pl/sql如何现实像sqlserver中的树形结构目录界面,就是能查看表视图那样的界面。

PL/Sql快速执行 insert语句的.sql文件

PL/SQL:如何启用模式中的所有触发器?

PL/SQL:如何运行存储在表列中的sql语句来获取sql语句的执行时间?