【问题标题】:want to run multiple SQL script file in one go with in SQLPLUS想在 SQLPLUS 中一次性运行多个 SQL 脚本文件
【发布时间】:2014-03-27 07:25:03
【问题描述】:

我必须一次运行多个 SQL 脚本文件。

就像每次我必须在 SQLPLUS 中编写命令一样

SQL>@d:\a.txt SQL>@d:\a2.txt SQL>@d:\a3.txt SQL>@d:\a4.txt

有没有办法将所有文件放在一个文件夹中并一次性运行所有脚本文件而不会丢失任何单个文件,例如 @d:\final.txt@d\final.bat

【问题讨论】:

  • 你试过windows批处理文件吗? (打开记事本,逐行编写命令)然后将文件保存为 FileName.bat(确保您已从保存对话框底部选择了所有文件选项。双击运行批处理文件即可。或者您可能需要该 bat 文件中的一些高级批处理命令

标签: sql sqlplus


【解决方案1】:

没有单一的 SQL*Plus 命令可以做到这一点,但您可以创建一个调用所有其他命令的单一脚本:

将以下内容放入批处理文件中

@echo off
echo.>"%~dp0all.sql"
for %%i in ("%~dp0"*.sql) do echo @"%%~fi" >> "%~dp0all.sql"

当您运行该批处理文件时,它将在批处理文件所在的同一目录中创建一个名为all.sql 的新脚本。它将在批处理文件所在的同一目录中查找所有扩展名为 .sql 的文件。

然后您可以使用sqlplus user/pwd @all.sql 运行所有脚本(或在创建all.sql 脚本后扩展批处理文件以调用sqlplus

【讨论】:

  • @rahuljain:抱歉,我不知道你在说什么。
  • 我运行了批处理文件。 all.sql 文件创建良好。我打开这个文件这个文件有代码 @"D:\test_SQL\Patch03.01.486.txt" @"D:\test_SQL\Patch03.01.487.txt" @"D:\test_SQL\Patch03.01.488.txt" 如果我​​运行像@all.sql 这样的文件可以正常工作吗?我必须在 prod 中运行所有 txt 文件
  • 这对我很有帮助,很好的回答
  • 有趣的事实:如果你先创建all.sql,然后把所有*.sql 文件放进去,你最终会得到all.sql 指向all.sql) 因此你最好删除那个引用避免永远循环执行
【解决方案2】:

如果你使用的是 gnu linux,你可以使用process substitution:

sqlplus USERNAME/PASSWORD@DOMAIN < <(cat a.txt a2.txt a3.txt a4.txt) 
# ... or a for loop on input files, inside the process substitution

或者,您可以创建一个.pdc 文件并列出您的 sql 脚本:

-- pdc file
@a.txt;
@a2.txt;
@a3.txt;
@a4.txt;

并调用sql plus:

sqlplus USERNAME/PASSWORD@DOMAIN < my_scripts.pdc

【讨论】:

  • 我尝试了这个解决方案并且它有效。但是我有很多文件编号为 file1.sql, file2.sql .. fileN.sql,它们列在 all.sql 文件中,如 all.sql --@file1.sql --@file2.sql --... -- @fileN.sql 问题是文件没有按照它们列出的顺序执行。如何强制它使用 all.sql 文件中列出的文件顺序?感谢您的回答,
【解决方案3】:

一些技巧和命令可以帮助您生成 master.sql 文件,您可以从该位置运行。

 c:\direcotory_location\dir *.sql /-t /b >master.sql

进入父目录打开master.sql 使用notepad++打开 删除 master.sql 行并使用正则表达式替换

   \n  with \n @

进入cmd 从 cmd

    C:\root_directory\sqlplus user/password @master.sql

如果我将 30 到 40 个脚本放在一个目录中,我发现这个过程非常方便。

【讨论】:

    【解决方案4】:

    可能值得花时间编写一个运行多个文件的 shell 脚本。

    #!/bin/ksh
    sqlplus user/password@instance <<EOF
    @a.txt
    @a1.txt
    exit
    EOF
    

    有关语法的更多信息,请查看Here Document

    【讨论】:

      【解决方案5】:

      像这样使用*.PDC扩展文件

      install.pdc文件内容

      whenever sqlerror exit sql.sqlcode
      
      prompt started!
      
      prompt 1.executing script 1
      @@install/01.script_1.sql
      
      prompt 2.executing script 2
      @@install/02.script_2.sql
      
      prompt 3.executing script 3
      @@install/03.script_3.sql
      
      prompt finished!
      

      @@install/ 指向 SQL 脚本所在的目录

      【讨论】:

        【解决方案6】:

        这里有类似的解决方案,但您不必迭代并具有特殊格式的 sql 文件名。您编写一个 sql 文件并运行一次。

        cat table_animal.sql > /tmp/temp.sql
        cat table_horse.sql >> /tmp/temp.sql
        cat table_fish.sql >> /tmp/temp.sql
        sqlplus USERNAME/PASSWORD@DOMAIN @/tmp/temp.sql
        

        【讨论】:

        • 同理,如果你想拼接一个目录下的所有SQL文件,你可以使用cat *.sql &gt; temp.sql
        【解决方案7】:

        对于 Windows 尝试 复制 /b *.sql +x final.sql

        sqlplus 用户/密码@final.sql

        【讨论】:

          【解决方案8】:

          特别感谢 约瑟夫·托雷

          sqlplus login/password@server @filename
          

          reference link

          【讨论】:

          • 这仅处理主题所有者已经有解决方案的单个 sql 文件。
          猜你喜欢
          • 1970-01-01
          • 2012-06-24
          • 1970-01-01
          • 2023-04-04
          • 2012-05-03
          • 1970-01-01
          • 2013-01-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多