想要在 oracle DB 上 运行 sql 脚本(写在 window 批处理文件中)

Want to run sql script (written in window batch file) on oracle DB

批处理文件片段

:: This setlocal is done to use variable syntax '!varname!' in nested for loop
setlocal  enableextensions enabledelayedexpansion
echo on
SET AUTOMATION_ACCOUNT_ID = some value
SET DB_SERVER_NAME = some value
SET DB_NAME = some value
SET all remaining variables

::AUTOMATION_ACCOUNT_CHECK
:: Checking if Automation Account is already created on DB (If not then create it first & then move to FREE_TRAIL_ACCOUNT_CHECK process)*

FOR /F "usebackq tokens=1" %%i IN (`sqlcmd -S %DB_SERVER_NAME% -h -1 -d %DB_NAME% -U %DB_SERVER_USERNAME% -P %DB_SERVER_PASSWORD% -Q"set nocount on; select (count(*)) from dbo.[ACCOUNTS] where ACCOUNT_ID ='%AUTOMATION_ACCOUNT_ID%';"`) DO set ACCOUNTCOUNT=%%i

echo "ACCOUNT COUNT is "!ACCOUNTCOUNT!
if !ACCOUNTCOUNT!==0 goto CREATE_AUTOMATION_ACCOUNT:
goto FREE_TRAIL_ACCOUNT_CHECK:`

我想在 oracle 实例上执行上面的脚本。

通过谷歌搜索,我了解到 sqlcmd 不适用于 oracle DB,我必须改用 sqlplus。使用 sqlplus ,我将上面的脚本转换如下

::AUTOMATION_ACCOUNT_CHECK
:: Checking if Automation Account is already created on DB (If not then create it first & then move to FREE_TRAIL_ACCOUNT_CHECK process)

 FOR /F "usebackq tokens=1" %%i IN ('sqlplus            
 %DB_SERVER_USERNAME%/%DB_SERVER_PASSWORD%@%DB_SERVER_NAME% @sqlscript.sql') DO @set ACCOUNTCOUNT=%%i
echo "ACCOUNT COUNT is "!ACCOUNTCOUNT!

其中 sqlscript.sql 包含

SELECT COUNT(*) from ACCOUNTS; exit;

但是这不起作用,因为我在尝试执行此批处理文件时在命令提示符下收到以下响应

 C:\Setup>FOR /F "usebackq tokens=1" %i IN ('sqlplus uname/pwd@host:port @sqlscript.sql') DO @set ACCOUNTCOUNT=%i 

 C:\Setup>echo "ACCOUNT COUNT is "!ACCOUNTCOUNT! 
 "ACCOUNT COUNT is "sqlplus
 C:\Setup>exit /B 0 

我正在打印此 'sqlplus' 而不是帐户计数 ... 你们能帮我解决这个问题吗?

此外,当我在 sqlplus 实用程序上执行相同的操作时,它起作用了

在 FOR 循环选项中使用 usebackq 意味着你应该使用反引号,当你想执行一个命令时,否则你将它作为一个字符串使用。

FOR /F "usebackq tokens=1" %%i IN (`sqlplus ...

代码开头的 SET 语句将无法按预期工作。

SET DB_NAME = some value

将创建一个名为 DB_NAME<space> 的变量,因此无法使用 %DB_NAME% 访问它。
使用 SET

时应避免使用空格

您遇到的主要问题是您指定了 userbackq 但随后在 sqlplus 调用周围使用了普通的直引号。您还需要添加 -s (无声)标志以抑制 SQL*Plus 横幅:

FOR /F "usebackq tokens=1" %%i IN (
`sqlplus -s %DB_SERVER_USERNAME%/%DB_SERVER_PASSWORD%@%DB_SERVER_NAME% @sqlscript.sql`
) DO @set ACCOUNTCOUNT=%%i

进行这些更改后,您会看到如下内容:

"ACCOUNT COUNT is "53

所以你可能也想从你的 echo 命令中删除双引号(并用 @ 隐藏命令,但我假设你现在显示它们是为了调试目的):

@echo ACCOUNT COUNT is !ACCOUNTCOUNT!