我找了很久,没找到问题的确切答案。 我有点批处理,所以也许我不明白,但这是我的问题:
我使用批处理文件对远程oracle数据库执行sql查询:
@echo @ScriptToExecute.sql | sqlplus username/password@database > result.txt
答案写在result.txt中,它看起来像这样:
-- assumed empty --
SQL*Plus: Release 9.2.0.1.0 - Production on Je Avr 27 12:34:34 2017
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connecté à :
Oracle9i Release 9.2.0.6.0 - Production
JServer Release 9.2.0.6.0 - Production
SQL>
COUNT(*)
----------
13
SQL>Déconnecté de Oracle9i Release 9.2.0.6.0 - Production
JServer Release 9.2.0.6.0 - Production
我想要的是打开这个文本文件并进入数字13的变量。 这样做的目的当然是每天执行一次批处理文件,以确保答案仍然是13。 最后,我的批处理文件必须返回查询的答案编号。
我想要的答案是第14行。
有什么想法吗?
感谢您的回复
编辑:我尝试过很多东西,比如使用powershell命令来使用我曾经在shell中知道的head和tail命令,但我没有使用powershell。
我也尝试使用sqlcmd,它可以过滤结果,但必须安装,我不能在不同的主机上安装任何东西。
我尝试以这种方式使用命令more +13
:
@echo @ScriptToExecute.sql | sqlplus username/password@database > more +13 result.txt
但它也不起作用......
答案 0 :(得分:0)
创建文件result.txt
set "numreturned="
for /f %%a in (result.txt) do if "%%a"=="----------" (
set "numreturned=%%a"
) else if defined numreturned set /a numreturned=%%a&goto foundit
:foundit
echo number returned=%numreturned%
或者,如果您不想创建result.txt
,
set "numreturned="
for /f %%a in (
'echo ScriptToExecute.sql ^| sqlplus username/password@database'
) do if "%%a"=="----------" (
set "numreturned=%%a"
) else if defined numreturned set /a numreturned=%%a&goto foundit
:foundit
echo number returned=%numreturned%
请注意,直接从提示执行和作为批处理文件的行是不同的。对于批处理行,metavariable
(循环控制变量)%%x
必须引用为%%x
,如果从命令提示符执行,则%x
必须引用for
。由于从提示中重复执行包含numreturned
的行没有意义(创建批处理文件更容易),我发布了批处理文件版本。如果需要,用户有责任根据提示进行调整。
将%%a
设置为 no (即未定义)
将文件读取到-
,只选择使用空格作为分隔符的第一个标记(标记和删除的默认值)
当-
的第一行显示时(有10个numreturned
个字符),请将-
设置为某个值,以便定义它。
当下一行到达时,它不会是numreturned
的行,但现在定义了:foundit
,因此从分配行(计数)的数据并通过转到标签 public class abcController
{
[Authorization]
public ActionResult findme()
{
var model = new Umbraco.Web.Models.RenderModel(CurrentPage);
ViewData["abc"] = Umbraco;
return View(model);
}
}
然后分析找到的值并做任何事情。
答案 1 :(得分:0)
所以,使用每个人都告诉我的一点,这就是答案:
@echo @ScriptToExecute.sql | sqlplus username/password@database | more
+13 > result.txt
set /p "number=" < result.txt
set number=%number: =%
set /A newnumber=%number
echo %newnumber%:ok
所以我首先连接到数据库并使用第一行中的答案创建result.txt。 然后我将第一行放在变量号中。 我摆脱了号码之前的所有空白区域。 最后,我创建了一个数值,在其中我放置了我的字符串并打印出来。
谢谢大家的回答:)
答案 2 :(得分:0)
根据您的新评论,此方法应该有效:
@echo off
echo @ScriptToExecute.sql | sqlplus username/password@database | more +13 > result.txt
for /F %%a in (result.txt) do set "number=%%a" & goto continue
:continue
echo %number%:ok
您也可以尝试这种方式,不要创建任何其他文件:
@echo off
for /F "skip=13" %%a in ('echo @ScriptToExecute.sql ^| sqlplus username/password@database') do (
set "number=%%a" & goto continue
)
:continue
echo %number%:ok