将bash用户输入传递给sql语句时出错

时间:2013-02-26 20:39:11

标签: linux oracle bash sqlplus

我正在尝试编写一个bash函数,该函数会提示架构所有者并删除所有相应的架构。

function db_cleanup

{
        #accept user input
        read -p "Schema Owner: " input

        sqlplus -s $usr1/$pwd1@$sid1 << EOF


declare
        usr_d varchar2(10) := '&input'; --reas user input here
        sqlstmt varchar2(128);
begin   
        sqlstmt := 'drop user '||$usr_d||' cascade';
        dbms_output.put_line(sqlstmt); execute immediate sqlstmt;

        sqlstmt := 'drop user ab_'||$usr_d||' cascade';
        dbms_output.put_line(sqlstmt); execute immediate sqlstmt;

        sqlstmt := 'drop user xy_'||$usr_d||' cascade';
        dbms_output.put_line(sqlstmt); execute immediate sqlstmt;
end;
/
EOF
}

输出如下:

    Enter Schema Owner: ABC
    Enter value for usr_in: 
    User requested Interrupt or EOF detected.

-bash-3.2$

请让我知道如何解决这个问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

汇集@ 244an和我自己的评论:

  • '&input'应为'$input',因为您指的是shell变量。
  • $usr_d应该是usr_d(没有$)因为你在这里引用了一个sheel变量;这来自PL / SQL declare部分。
  • SQL * Plus的-s标志禁止横幅;但你原来的问题表明,所以不确定你是否已经在途中遗失了。

所以:

function db_cleanup
{
        #accept user input
        read -p "Schema Owner: " input

        sqlplus -s $usr1/$pwd1@$sid1 << EOF
set timing off
set feedback off
set serverputput on size 10000
spool $log_file.out

declare
        usr_d varchar2(10) := '$input';
        sqlstmt varchar2(128);
begin   
        sqlstmt := 'drop user '||usr_d||' cascade';
        dbms_output.put_line(sqlstmt);
        execute immediate sqlstmt;

        sqlstmt := 'drop user ab_'||usr_d||' cascade';
        dbms_output.put_line(sqlstmt);
        execute immediate sqlstmt;

        sqlstmt := 'drop user xy_'||usr_d||' cascade';
        dbms_output.put_line(sqlstmt);
        execute immediate sqlstmt;
end;
/
EOF
}

不确定您是否想要清理您给出的架构...有很多用户您真的不想意外丢弃。 Any of these一开始,你可能也有自己的。