正在从 Oracle 假脱机中删除 PL/SQL 代码

Removing PL/SQL Code from Oracle spool

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

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 BEGIN 4 /* Check Version / 5 SELECT version 6 INTO vVersion 7
FROM PRODUCT_COMPONENT_VERSION where product like '%Oracle Database 12c%'; 8 9 -- 10 /
loop through users */ 11 FOR i IN (SELECT * 12 FROM DBA_USERS_WITH_DEFPWD) 13
LOOP 14 /* print a statement, based on vVersion, for the current user */ 15 IF (vVersion = '12.1.0.2.0') 16
THEN 17 DBMS_OUTPUT.put_line ( 18 'Alter user ' 19 || i.username 20 || ' identified by values ' 21 || '''462368EA9F7AD215''' 22
|| ';'); 23 ELSE 24 DBMS_OUTPUT.put_line ( 25
'Alter user ' 26 || i.username 27 || ' identified by values ' 28 || '''Invalid Password''' 29 || ';'); 30 END IF; 31 END LOOP; 32 END; 33 / Alter user GSMUSER identified by values '462368EA9F7AD215';
Alter user MDSYS identified by values '462368EA9F7AD215';
Alter user OLAPSYS identified by values '462368EA9F7AD215';
Alter user LBACSYS identified by values '462368EA9F7AD215';
Alter user ORDDATA identified by values '462368EA9F7AD215';
Alter user ORDSYS identified by values '462368EA9F7AD215';
Alter user DVF identified by values '462368EA9F7AD215';
Alter user SYSDG identified by values '462368EA9F7AD215'; ....

SQL*Plus 不支持交互式会话的 set echo off。这是 documented:

ECHO does not affect the display of commands you enter interactively or redirect to SQL*Plus from the operating system.

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

sqlplus user/passwd@tns < script.sql

您会看到许多 "SQL>" 提示也回显到您的终端,以及 alter 语句。

您可以使用静默标志:

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

或 运行 作为脚本而不是交互方式(尽管您需要在脚本末尾添加 exit ,否则它会在等待您键入时挂起那个):

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;