Oracle 在 bat 文件中导入批处理文件

Posted

技术标签:

【中文标题】Oracle 在 bat 文件中导入批处理文件【英文标题】:Oracle import batch files within a bat file 【发布时间】:2017-01-24 14:49:04 【问题描述】:

我必须运行几个 bat 文件才能将大量数据导入 Oracle。 我只想运行一个 bat 文件。

批处理文件位于单独的子文件夹中,如下所示:

g:\1\import.bat
g:\2\import.bat
...
g:\n\import.bat

它们看起来像这样:

@echo off
REM Copyright (c) 1999-2004 by Intergraph Corporation. All Rights Reserved.
REM Use this script to create feature class tables via SQL and populate tables with SQL*Loader.
REM The GDOSYS schema is no longer created via this script. If you want metadata to be loaded,
REM GDOSYS needs to exist prior to running import. You may use Database Utilities to create GDOSYS.
REM If you are using a comma for a decimal separator, set the NLS_NUMERIC_CHARACTERS parameter:
REM SET NLS_NUMERIC_CHARACTERS=,.
if "%1"=="" goto usage
SQLPLUS %1> @"kat_ki_vectors_epulet_i_pre.sql"
SQLLDR %1 CONTROL='kat_ki_vectors_epulet_i'
SQLPLUS %1 @"kat_ki_vectors_epulet_i_post.sql"
goto end
: usage
echo SYNTAX:  "Import username/password@ConnectString" 
echo WHERE:
echo - username/password is the Oracle user account where the data will be loaded.
echo - ConnectString is the Oracle NET string used to connect to the Oracle server.
echo See the document "Working with GeoMedia Professional" for more
information.
echo EXAMPLES:
echo Import scott/tiger@db_orcl
: end 
pause

我尝试使用这个 bat 文件(通过正确的身份验证)运行所有这些:

call g:\1\import.bat ###/###@###.##
call g:\2\import.bat ###/###@###.##
...
call g:\n\import.bat ###/###@###.##

但这就是我得到的:

G:\>do_the_trick.bat
G:\>call g:\1\import.bat ###/###@###.##
SQL*Plus: Release 11.1.0.6.0 - Production on K. Jan. 24 15:35:08 2017
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
Kapcsolódási cél:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options
SP2-0310: nem lehet megnyitni a(z) "kat_ki_vectors_epulet_i_pre.sql" fájlt

"Kapcsolódási cél" ---> "Connecting target"
"nem lehet megnyitni a(z) " ---> "Can not be opened"

但是,如果我直接运行第一个 bat 文件

G:\1>import.bat ###/###@###.##

导入开始。

请给我一些尝试的提示!

【问题讨论】:

不同之处在于您从它的子目录手动运行批处理。 【参考方案1】:

这批应该可以工作,并且只需要设置最大可能的数量。 该批次将评估当前的最高数字。

@Echo off
CD /D "G:\"
:: first get the highest number increase if max > 1000
For /L %%N in (1,1,1000) Do If Exist "G:\%%N" (Set Max=%%N) Else Goto :Cont
:Cont
:: iterate through all numbered subdirs
For /L %%N in (1,1,%Max%) Do (
  Pushd "G:\%%N"
  Call import.bat ###/###@###.##
  PopD
)

要获取 G:\ALL 个子目录,您可以使用

@Echo off
For /D %%A in (G:\*) Do (
  Pushd "%%~fA"
  Call import.bat ###/###@###.##  
  PopD
)

EDIT 另一个版本,它通过管道将(空)回显传递给 import.bat,因此无需手动进行确认。它还检查 import.bat 是否存在

@Echo off
Set App=Import.bat
Set Cred=###/###@###.##  
For /D %%A in (G:\*) Do (
  Pushd "%%~fA"
  If Exist %APP% Echo:|Call %App% %Cred%
  PopD
)

【讨论】:

好吧,我猜我有点误导:子文件夹名称中的数字仅表示有很多子文件夹。他们的真实姓名是字母数字。但我用包含 Import.bat 的 3 个子文件夹尝试了你的脚本。 g:\1\ g:\2\ g:\3\ 这就是我得到的:“系统找不到指定的批次标签 - 继续” @STO 对不起,我的错,只是忘记了(以上更改)。是否要处理 `G:` 中的所有子文件夹? @STO 我添加了一个版本,它将迭代 `G:`ALL 子目录 第二个版本运行良好,但在两个导入过程之间我必须按任意键:) 因为 import.bat 文件末尾的“暂停”。从每个 import.bat 末尾删除暂停并不是什么大事,但也许您可以在脚本中添加一些忽略此暂停的内容。 @STO 抱歉耽搁了。我将添加另一个版本,它将(空)回显管道传输到 import.bat,因此无需手动执行。它还检查 import.bat 是否存在。

以上是关于Oracle 在 bat 文件中导入批处理文件的主要内容,如果未能解决你的问题,请参考以下文章

cmd下执行bat文件的命令

从 bat 文件(oracle、批处理)运行 sql 脚本

bat文件命令大全

windows下使用bat批处理文件定时自动备份oracle数据库并上传ftp服务器

通过MSSQl作业定时执行批处理BAT文件

怎么用批处理*.bat 执行文件目录下面的SQL语句脚本(批量的)