0

我正在尝试编写一个 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$

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

4

1 回答 1

0

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

  • '&input'应该是'$input',因为你指的是一个 shell 变量。
  • $usr_d应该是usr_d(没有$),因为您在这里不是指 sheel 变量;这来自 PL/SQLdeclare部分。
  • 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
}

不确定您是否可能要清理您获得的架构......您真的不想意外放弃许多用户。任何一个开始,你可能也有自己的。

于 2013-02-26T23:59:50.393 回答