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'シェル変数を参照しているためです。
  • $usr_dここではシェル変数を参照していないusr_dため、(なしで$)する必要があります。これは 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
}

与えられたスキーマをサニタイズする必要があるかどうかはわかりません...誤って削除したくないユーザーがたくさんいます。これらのいずれかを開始すると、独自のものもあるかもしれません。

于 2013-02-26T23:59:50.393 に答える