Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Shell脚本中的另一个目录运行SQL脚本_Shell_Unix - Fatal编程技术网

从Shell脚本中的另一个目录运行SQL脚本

从Shell脚本中的另一个目录运行SQL脚本,shell,unix,Shell,Unix,在unixshell脚本中,我在一个目录ex:-cd/usr/was/scr中,然后在连接到SQLPLUS登录到数据库后,从不同的目录位置ex:-/usr/was/abcd运行SQL脚本文件xyz.SQL。如何在登录数据库后执行xyz.sql。这里是示例代码 cd /usr/was/scr sqlplus -s <schema>/<user>@<tns> << EOF exec xyz.sql spool xyz.log exit; EOF xy

在unixshell脚本中,我在一个目录ex:-cd/usr/was/scr中,然后在连接到SQLPLUS登录到数据库后,从不同的目录位置ex:-/usr/was/abcd运行SQL脚本文件xyz.SQL。如何在登录数据库后执行xyz.sql。这里是示例代码

cd /usr/was/scr
sqlplus -s <schema>/<user>@<tns> << EOF
exec xyz.sql
spool xyz.log
exit;
EOF

xyz.sql文件位于/usr/was/abcd目录中。

如果从脚本中调用此文件,我认为最安全的方法是首先指定路径:

sqlpluspath=/usr/was/scr        #or "${ORACLE_HOME}/bin" or wherever it is if not in $PATH 
spoolfile=/usr/was/scr/xyz.log  #spool file
PATH="${PATH}:$sqlpluspath" \
SQLPATH="${SQLPATH}:/usr/was/abcd" \
sqlplus -s <schema>/<user>@<tns> << EOF
spool $spoolfile
@xyz.sql
exit;
EOF

exec/usr/was/abcd/xyz.sql不工作吗?首先为什么要cd?SQL文件位于/usr/was/abcd中,但您提到的日志文件位于/usr/was/scr/xyz.log中。也无法理解第三行和第四行。@user8487380 sqlplus二进制文件在哪里?这些行为程序和shell设置环境变量$PATH是这样的,您可以从任何地方调用二进制文件,$SQLPATH是这样的,您可以通过调用它的名称来引用程序中的任何脚本。i、 e.@xyz.sql。我对SQLPLUS了解不够,无法理解exec指令应该做什么,但有充分的文档证明@是START的别名。我很高兴被纠正。我可以用别名代替cd吗。如何使用alias转到我有20多个sql脚本文件的路径,以便我无法逐个声明。@user8487380由您决定;如果有20个脚本位置,则需要:将它们全部移动到一个位置,引用每个脚本位置以设置$SQLPATH,或者单独引用每个脚本文件的完整路径。对我来说,将脚本组织到几个位置,并将这些位置添加到$SQLPATH中,这样您就可以只使用它们的名称来运行它们,这样做是有意义的。@user8487380您说过您已经这么做了吗?在任何情况下,在脚本中运行命令与在shell中运行命令非常相似。看见