【问题标题】:Execute SQL from batch file从批处理文件执行 SQL
【发布时间】:2012-12-26 23:22:35
【问题描述】:

我是批处理文件脚本的新手。

我想要的只是创建一个调用 SQL 文件并将结果存储在文本文件中的批处理文件。

谁能帮帮我,非常感谢你的帮助,

这是我第一次需要创建这样的文件。

【问题讨论】:

  • 请让您的问题更明确:您使用的是什么数据库? SQL Server(版本)? MySQL?甲骨文?如果您使用的是 SQL Server,您是否阅读过 SQLCMD (msdn.microsoft.com/en-us/library/ms165702(v=SQL.105).aspx) 的文档?
  • 很抱歉,我使用的是 Oracle 10g 数据库

标签: oracle batch-file sqlplus


【解决方案1】:
sqlcmd -S sqlservername -i yoursqlfile.sql -U username -P password -o outputfile.txt

【讨论】:

    【解决方案2】:

    使用批处理文件:

    保存并运行:

    @echo off
    sqlplus -s -l user/pass@yourdb @yoursql.sql>your_log.log
    

    附言请务必将 sql 脚本的最后一行设置为 exit; 否则批处理文件将挂起。

    【讨论】:

    • 感谢 Dazzal 的帮助,这非常有帮助,但仍然存在问题,因为即使我尝试在 TOAD 上运行查询并返回结果,日志文件也是空的。下面是脚本:@echo off sqlplus -s -l DBUserName/dbPassword@DBName @SQLFile.sql>ResultFile.txt
    • @Manaysah 如果您随后登录 sqlplus 并在没有 DOS 批处理的情况下运行该脚本,它会输出任何内容吗?如果它使用 dbms_output 输出数据,请确保您的脚本顶部有 set serveroutput on size 1000000
    • Dazzal,谢谢问题出在SQL文件中,sql应该包含在双引号中。我包括了“”字符,但提出的另一个问题是“@”字符。用“start”替换“@”解决了这个问题,但结果似乎无关紧要。结果文件如下所示“SQL*Plus: Release 11.2.0.2.0 Production Copyright (c) 1982, 2010, Oracle。保留所有权利......”
    • 解决问题的问题是将查询放在双引号中,通过用分号 (;) 替换它来解决问题
    • @DazzaL 谢谢你,但即使使用exit;,批处理文件仍然挂起......有什么想法吗?
    【解决方案3】:

    我创建了一个更高级的启动器,试试看(你可以在http://www.unix.com/windows-and-dos-issues-and-discussions/256021-windowss-batch-launcher-oracle-sql-linux-sh-scripts-available-here.html找到最新版本)

    下面是代码:

    launcher.cmd

    @ECHO OFF
    
    rem Script Launcher by Fr3dY v1.4
    rem ##############################
    rem Version History:
    rem 1.4 - Misc. fixes
    rem 1.3 - Merged with 'server launcher', now accepts both SQL and SHELL SCRIPTS
    rem 1.2 - Interactive prompt to show the file on screen
    rem 1.1 - No need to add 'quit;' or 'exit;' in the .sql file anymore
    rem       Fixed sqlplus waiting for username/password if the first attempt was unsuccessful
    rem       Log file is generated automatically, including date and time in name
    rem       Misc. fixes
    rem 1.0 - Initial Version
    
    :MAIN
    ::Path of PLINK
    set PLINK="C:\Program Files (x86)\PuTTY\plink.exe"
    ::List with TNS NAMES
    set dbservers=launcher-databases.txt
    ::List with LINUX SERVERS
    set linuxservers=launcher-servers.txt
    
    set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
    set dt=%dt: =0%
    
    echo Choose launcher mode:
    echo 1) Database scripts (.sql files)
    echo 2) Shell scripts (.sh files)
    set /p launchermode="Insert value: "
    echo.
    
    if %launchermode%==1 (
      set extension=sql
      set servers=%dbservers%
      set mode=DB
    ) else (
        if %launchermode%==2 (
          set extension=sh
          set servers=%linuxservers%
          set mode=OS
        ) else (echo "Incorrect value, exiting..." & goto :END)
    )    
    
    if exist %servers% (
      goto :LISTFILES
    ) else echo FILE %servers% NOT FOUND, ABORTING & goto :END
    
    
    :LISTFILES
    echo Listing *.%extension% files...
    echo.
    dir /b *.%extension%
    echo.
    
    set /p file=Name of the file to be launched (without extension)? 
    
    if exist %file%.%extension% (
      goto :CONFIRMSHOW
    ) else echo FILE %file%.%extension% NOT FOUND, ABORTING & goto :END
    
    
    :CONFIRMSHOW
    echo.
    set /p confirm=Show the script %file%.%extension% on screen now? 
    if %confirm%==y (
      goto :SHOWSCRIPT
      ) else goto :CONFIRMEXEC
    echo.
    
    :SHOWSCRIPT
    echo.
    echo Content of %file%.%extension%
    echo ######################
    type %file%.%extension%
    echo.
    echo ######################
    echo.
    
    :CONFIRMEXEC
    set /p confirm=Are you sure you want to execute this script? 
    if %confirm%==y (
      set /p user=%mode% username?  
      goto :HInput
      ) else echo ABORTED & goto :END
    echo.
    echo Output saved to %file%_%dt%.log
    echo.
    Goto :END
    
    :HInput
    ::Hidden.cmd
    ::Tom Lavedas, 02/05/2013, 02/20/2013
    ::Carlos, 02/22/2013
    ::https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/f7mb_f99lYI
    ::Version 3.0     
    SetLocal DisableDelayedExpansion
    echo.
    Echo Enter password:
    Set "Line="
    Rem Save 0x08 character in BS variable
    For /F %%# In (
    '"Prompt;$H&For %%# in (1) Do Rem"'
    ) Do Set "BS=%%#"
    
    :HILoop
    Set "Key="
    For /F "delims=" %%# In (
    'Xcopy /L /W "%~f0" "%~f0" 2^>Nul'
    ) Do If Not Defined Key Set "Key=%%#"
    Set "Key=%Key:~-1%"
    SetLocal EnableDelayedExpansion
    If Not Defined Key echo. & Goto :HIEnd
    If %BS%==^%Key% (Set /P "=%BS% %BS%" <Nul
    Set "Key="
    If Defined Line Set "Line=!Line:~0,-1!"
    ) Else Set /P "=*" <Nul
    If Not Defined Line (EndLocal &Set "Line=%Key%"
    ) Else For /F delims^=^ eol^= %%# In (
    "!Line!") Do EndLocal &Set "Line=%%#%Key%"
    Goto :HILoop
    
    :HIEnd
    if %launchermode%==1 (
      goto :EXECDB
    ) else goto :EXECLINUX
    
    :EXECDB
    FOR /f %%A IN (%servers%) DO CALL ECHO DATABASE: %%A & ECHO DATABASE: %%A >> %file%_%dt%.log & sqlplus -S -L %user%/!Line!@%%A < %file%.%extension% >> %file%_%dt%.log
    goto :END
    
    :EXECLINUX
    FOR /f %%A IN (%servers%) DO CALL ECHO SERVER: %%A & ECHO SERVER: %%A >> %file%_%dt%.log & echo y | %PLINK% %user%@%%A -pw !Line! "exit" & %PLINK% %user%@%%A -pw !Line! -batch -m %file%.%extension% >> %file%_%dt%.log & echo. >> %file%_%dt%.log
    goto :END
    
    :END
    pause
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多