在bash / sqlplus中,一个接一个地调用两个函数失败

时间:2013-02-23 04:03:35

标签: linux oracle bash sqlplus

我有两个功能 - ABC,XYZ。 ABC删除table1中的某些行作为user1,XYZ将某些用户作为DB User删除。首先我打电话给ABC,然后是XYZ。 ABC功能正在执行,但在XYZ,它失败了 - “XYZ:命令未找到”

function ABC
{
        sqlplus -s $ur1/$pwd@$SID << EOF

        delete from table1 where row_name = 'A1';
        delete from table2 where row_name = 'A2';
        exit

        EOF
}

function XYZ
{
 sqlplus eip_dba/eip_dba$result@${input} << eof
 set timing off
 set serveroutput on size 10000
 set feedback off
 spool xyz_$input.out

 drop user usr1 cascade;
 drop user usr2 cascade;
 drop user usr3 cascade;
 commit;
 exit
 eof
}

ABC
XYZ

bash-3.2$ ./db_test.sh 

2 rows deleted.


2 rows deleted.

./db_test.sh: line 100: XYZ: command not found

请让我知道出了什么问题。

提前致谢。

2 个答案:

答案 0 :(得分:4)

尝试在EOF之前删除空格

function ABC
{
        sqlplus -s $ur1/$pwd@$SID << EOF

        delete from table1 where row_name = 'A1';
        delete from table2 where row_name = 'A2';
        exit

EOF
}

我在一个示例程序中尝试了这个并修复了问题。

答案 1 :(得分:0)

here-documents的格式为:

    <<WORD
here-document content ...
    here-document content ...
  here-document content ...
WORD

WORD可以是您喜欢的任何标签,但结束标记必须是该行的唯一标记,之前或之后没有空格。

在您的示例函数中,您使用eofEOF作为标签,您应该从它们前面删除空格字符,以便它们真正位于行的开头,如下所示:

function ABC
{
        sqlplus -s $ur1/$pwd@$SID << EOF

        delete from table1 where row_name = 'A1';
        delete from table2 where row_name = 'A2';
        exit

EOF
}

function XYZ
{
 sqlplus eip_dba/eip_dba$result@${input} << eof
 set timing off
 # ... and so on ....

eof
}

也就是说,结尾EOFeof就在行的开头,没有尾随空格。