从Oracle spool

时间:2016-04-07 09:13:53

标签: oracle plsql spool

执行以下代码假脱机输出文件' user.sql'中的PL / SQL代码。有没有办法从输出文件中删除PL / SQL代码?只有'更改用户......'语句必须保留在outputfile中。

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> DECLARE 2 vVersion VARCHAR2(100); 3开始4 / *   检查版本 / 5 SELECT版本6 INTO vVersion 7
  FROM PRODUCT_COMPONENT_VERSION其中的产品类似于Oracle数据库   12C%&#39 ;; 8 9 - 10 /
循环用户* / 11 FOR i   IN(SELECT * 12 FROM DBA_USERS_WITH_DEFPWD)13
  LOOP 14 / *打印基于vVersion的声明   当前用户* / 15 IF(vVersion =' 12.1.0.2.0')16
  那么17 DBMS_OUTPUT.put_line(18' Alter   用户' 19 || i.username 20 || '确定   通过价值观' 21 || ''' 462368EA9F7AD215''' 22个
  || &#39 ;;&#39); 23 ELSE 24 DBMS_OUTPUT.put_line(25
  '改变用户' 26 || i.username 27 || '   由价值观识别' 28 || '''无效密码'''' 29   || &#39 ;;&#39); 30结束IF; 31结束循环; 32结束; 33 /改变   用户GSMUSER由值' 462368EA9F7AD215';确定   更改用户MDSYS标识值' 462368EA9F7AD215';
  更改用户OLAPSYS,用值' 462368EA9F7AD215';   更改用户标识的LBACSYS' 462368EA9F7AD215';
  更改用户标识的用户ORDDATA' 462368EA9F7AD215';
  更改用户标识的用户ORDSYS' 462368EA9F7AD215';
  更改用户DVF标识值' 462368EA9F7AD215';
  更改用户SYSDG标识值' 462368EA9F7AD215'; ....

1 个答案:

答案 0 :(得分:1)

SQL * Plus并不尊重交互式会话的set echo off。这是documented

  

ECHO不会影响您以交互方式输入的命令的显示或从操作系统重定向到SQL * Plus。

如果将该代码粘贴到SQL plus会话中,您将看到该行为。如果你输入重定向,你也会看到它,例如来自Linux命令行:

sqlplus user/passwd@tns < script.sql

你会看到很多&#34; SQL&gt;&#34;提示也会回显到你的终端,加上alter语句。

您可以使用静音标志:

sqlplus -s user/passwd@tns < script.sql

或以脚本而非交互方式运行(尽管您需要在脚本末尾添加exit,否则它会在等待您输入时挂起):< / p>

sqlplus user/passwd@tns @script.sql

或两者:

sqlplus -s user/passwd@tns @script.sql

静默标志也会抑制SQL * Plus横幅,因此整体上会产生更少的混乱 - 尽管那些不会进入假脱机文件。

与问题无关,但您不需要将命令假脱机到文件,然后将其作为脚本运行。您可以直接将alter命令作为动态SQL运行:

   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;