想要在 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!
批处理文件片段
:: 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!