Shell 脚本中的 SQL* PLUS 连接问题

Posted

技术标签:

【中文标题】Shell 脚本中的 SQL* PLUS 连接问题【英文标题】:Issue with the SQL* PLUS connections in a Shell Script 【发布时间】:2012-02-08 12:13:42 【问题描述】:

我们可以在一个 shell 脚本中有多个 SQL* PLUS 连接吗?

我编写了一个 shell 脚本,使用 SQL* PLUS 的 COPY 命令将表的数据从一个数据库复制到另一个数据库。我没有创建数据库链接的权限,所以我使用的是 COPY 命令。

我需要复制大约 50 个表的数据。当数据集较小时,它会运行并复制所有表的数据。但是当数据集很大时,它会卡住,我会在 unix 机器上收到会话不活动消息。

我想拆分语句并写如下:但是我收到错误“SP2-0042:未知命令“END1” - 其余行被忽略。”和 "SP2-0042: 未知命令 "END" - 忽略行的其余部分。"

#!/bin/bash
export ORACLE_HOME=/ora00/app/oracle/product/9.2.0.8
export PATH=$PATH:$ORACLE_HOME/bin

args=$#

if [ $args == 1 ]
then
    echo "Shell script started"
else
    echo "Wrong number of arguments"
exit 1  
fi

time_start=`date +%H%M%S`
echo $time_start

    sqlplus -s srcUN/srcPwd@srcSID <<END1       
    COPY from srcUN/srcPwd@srcSID to dstUN/dstPwd@dstSID INSERT tab1 USING SELECT * FROM tab1 WHERE col1 = $1;
    COPY from srcUN/srcPwd@srcSID to dstUN/dstPwd@dstSID INSERT tab2 USING SELECT * FROM tab2 WHERE col1 = $1;
    END1

    sqlplus -s srcUN/srcPwd@srcSID <<END2 
        COPY from srcUN/srcPwd@srcSID to dstUN/dstPwd@dstSID INSERT tab3 USING SELECT * FROM tab3 WHERE col1 = $1;
    END2

#END

你能帮我解决这个问题吗?

谢谢, 萨维塔

【问题讨论】:

你的问题的标题有点误导 - 这看起来像一个 shell 脚本问题。如果您更改标题,您可能会得到更多的 shell 脚本专家。 谢谢乔尔塔。我已经更改了标题...希望它现在可以使用。 :) 【参考方案1】:

问题在于END1END2 没有被识别为输入重定向的结尾,因为它们有前导空格。

删除这两行上的所有空格,它应该可以工作。

【讨论】:

以上是关于Shell 脚本中的 SQL* PLUS 连接问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UNIX shell 脚本中执行临时存储过程?是不是可以在 sql-plus 中使用 IF-ELSE/WHILE 循环?

从 python 运行 sql 脚本时如何仅抑制 SQL*Plus 横幅消息

SQL*Plus中怎么执行多个*sql脚本文件

在 sql plus 中的脚本中运行循环

如何忽略从 SQL Plus 运行的 SQL 脚本中的 & 符号?

在 SQL*Plus 中,如何更改提示以显示已连接的用户和数据库?