2016-04-07 3 views
0

次のコードを実行すると、PL/SQLコードが出力ファイル 'user.sql'にスプールされます。出力ファイルからPL/SQLコードを削除する方法はありますか? 'alter user ...'文だけが出力ファイルに残る必要があります。OracleスプールからのPL/SQLコードの削除

set serveroutput on 
SET TERMOUT OFF 
SET ECHO  OFF 
SET FEEDBACK OFF 
SET LINESIZE 140 
SET PAGESIZE 0 

EXEC dbms_output.enable(NULL); 
SPOOL user.sql 

DECLARE 
    vVersion VARCHAR2 (100); 
BEGIN 
    /* Check Version */ 
    SELECT version 
    INTO vVersion 
    FROM PRODUCT_COMPONENT_VERSION where product like '%Oracle Database 12c%'; 

    -- 
    /* loop through users */ 
    FOR i IN (SELECT * 
       FROM DBA_USERS_WITH_DEFPWD) 
    LOOP 
     /* print a statement, based on vVersion, for the current user */ 
     IF (vVersion = '12.1.0.2.0') 
     THEN 
     DBMS_OUTPUT.put_line (
       'Alter user ' 
      || i.username 
      || ' identified by values ' 
      || '''462368EA9F7AD215''' 
      || ';'); 
     ELSE 
     DBMS_OUTPUT.put_line (
       'Alter user ' 
      || i.username 
      || ' identified by values ' 
      || '''Invalid Password''' 
      || ';'); 
     END IF; 
    END LOOP; 
END; 
/
SPOOL OFF 
set serveroutput off 
@user.sql 

出力例:

SQL> 2 vVersion VARCHAR2(100)を宣言。 3 BEGIN 4/* チェック・バージョン/5 SELECTバージョン6 INTO vVersion 7
FROM PRODUCT_COMPONENT_VERSIONここで '%Oracle Database 12c%'のような製品はありません。 8 9 - ユーザスルー10/
ループ*/11 I IN(* DBA_USERS_WITH_DEFPWD 12から選択)13
ループ14/* 現在のユーザのために、vVersionに基づいて文を印刷する*/15(vVersion IF FOR = '12 .1.0.2.0 ')16
THEN 17値' 21 || '' '462368EA9F7AD215' ''によって、 が識別されました
|| ';'); 23 ELSE 24 DBMS_OUTPUT.put_line(25
'ユーザーを変更する26 || i.username 27 ||' 012 || '' '無効なパスワード' ''によって識別される || ';'); 30 END IF; 31 END LOOP; 32 END; 33/Alter ユーザー '462368EA9F7AD215'によって識別されたGSMUSER。
値 '462368EA9F7AD215'によって識別されるユーザーMDSYSを変更します。
値「462368EA9F7AD215」で識別されるユーザーOLAPSYSを変更します。
値 '462368EA9F7AD215'によって識別されるユーザーLBACSYSを変更します。
値 '462368EA9F7AD215'で識別されるユーザーORDDATAを変更します。
値 '462368EA9F7AD215'によって識別されるユーザーORDSYSを変更します。
値 '462368EA9F7AD215'によって識別されるユーザーDVFを変更します。
値 '462368EA9F7AD215'で識別されるユーザーSYSDGを変更します。 ....

+0

スクリプトでそのコードを配置し、 'SQLプロンプトから' @でスクリプトを実行することはできますか? –

答えて

1

SQL * Plusは、対話セッションのためにset echo offを尊重しません。これはdocumented

オペレーティング・システムから対話形式で入力するかSQL * Plusにリダイレクトするコマンドの表示には影響しません。

そのコードをSQL Plusセッションに貼り付けると、その動作が表示されます。入力のリダイレクトを行うと、これも表示されます。

sqlplus user/[email protected] < script.sql 

"SQL>"というプロンプトが端末にエコー表示され、さらには変更ステートメントが表示されます。それ以外の場合は、しばらく時間がハングアップしたように見えるだろう、

sqlplus -s user/[email protected] < script.sql 

たり、スクリプトの最後にexitを追加する必要があるものの(代わりに対話形式でのスクリプトとして実行:

サイレントフラグを使用しますか、あなたはそれを入力することは)待つ:

sqlplus user/[email protected] @script.sql 

または両方:

sqlplus -s user/[email protected] @script.sql 

サイレント・フラグはSQL * Plusバナーも抑制するので、スプール・ファイルには含まれませんが、全体的なクラッタは少なくなります。


質問には関係ありませんが、コマンドをファイルにスプールしてスクリプトとして実行する必要はありません。あなただけの、動的SQLとして直接alterのコマンドを実行することができます

LOOP 
     IF (vVersion = '12.1.0.2.0') 
     THEN 
     execute immediate 'Alter user ' 
      || i.username 
      || ' identified by values ' 
      || '''462368EA9F7AD215''' 
      || ';'); 
     ELSE 
     execute immediate 'Alter user ' 
      || i.username 
      || ' identified by values ' 
      || '''Invalid Password''' 
      || ';'); 
     END IF; 
    END LOOP; 
関連する問題