首页 > 解决方案 > 如何在厨师食谱中运行一批 sql 文件

问题描述

我需要在厨师食谱中运行一些 SQL 脚本文件。当我使用以下资源执行食谱时batch,什么都没有发生。

batch 'cdb_scripts' do
    architecture :x86_64
    code <<-EOH    
      C:\\app\\Administrator\\product\\12.2.0\\dbhome_1\\bin\\sqlplus /nolog @C:\\app\\scri\\CreateDB.sql
      C:\\app\\Administrator\\product\\12.2.0\\dbhome_1\\bin\\sqlplus /nolog @C:\\app\\scri\\CreateDBFiles.sql
      C:\\app\\Administrator\\product\\12.2.0\\dbhome_1\\bin\\sqlplus /nolog @C:\\app\\scri\\CreateDBCatalog.sql
    EOH
    not_if {File.exists?('C:\scri\cdb')}
  end

每个脚本都需要相当长的时间来运行,只有在前一个脚本完成后我才需要继续下一个脚本。上面的代码没有执行任何操作。

我使用execute的资源如下:

execute 'test_script_execute' do
  environment ({"ORACLE_SID" => "orclsid"})
  command "C:\\app\\Administrator\\product\\12.2.0\\dbhome_1\\bin\\sqlplus.exe -s sys/Password_123@orclsid as sysdba @C:\\app\\scri\\CreateDB.sql"  
  only_if  {some_guard_condition}
  timeout 1800
end

这只是记录“execute[test_script_execute] 运行成功”。但是脚本没有运行。

在任务管理器中,sqlplus.exe正在运行。似乎是挂起而不是执行。

有人可以给我一个可行的建议,让我按顺序运行多个 SQL 文件而不会相互重叠吗?

谢谢

标签: chef-infraoracle12cchef-recipe

解决方案


我找到了一种简化需求并执行一批脚本的方法。我创建了一个批处理文件并在那里添加了 sql 脚本调用。它工作完美。不幸的是,没有直接的方法可以直接调用没有错误的 sql 脚本文件。如果您有类似的要求,可以使用以下代码片段。

在我放入的批处理文件中

ORACLE_HOME\bin\sqlplus /nolog @C:\script_path\myscriptscall.sql

在 myscriptscall.sql 中

set verify off
echo on 
spool C:\logs_path\scriptlogs.log

@C:\script_path\sqlscript1.sql
@C:\script_path\sqlscript2.sql
@C:\script_path\sqlscript3.sql

spool off
exit;

确保在执行后“退出”,否则程序将挂起。


推荐阅读