【问题标题】:Removing PL/SQL Code from Oracle spool从 Oracle 假脱机中删除 PL/SQL 代码
【发布时间】:2016-07-28 01:37:03
【问题描述】:

执行以下代码将假脱机输出文件“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 开始 4 /* 检查版本 /5 选择版本 6 INTO vVersion 7
FROM PRODUCT_COMPONENT_VERSION where product like '%Oracle Database 12c%'; 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 '改变 用户 ' 19 || i.username 20 || ' 确定 按值 ' 21 || '''462368EA9F7AD215''' 22
|| ';'); 23 ELSE 24 DBMS_OUTPUT.put_line ( 25
'改变用户' 26 || i.用户名 27 || ' 由值 '28 || 标识'''密码无效''' 29 || ';'); 30 结束如果; 31 结束循环; 32 结束; 33 / 改变 用户 GSMUSER 由值“462368EA9F7AD215”标识;
更改由值“462368EA9F7AD215”标识的用户 MDSYS;
更改由值“462368EA9F7AD215”标识的用户 OLAPSYS;
更改由值“462368EA9F7AD215”标识的用户 LBACSYS;
更改由值“462368EA9F7AD215”标识的用户 ORDDATA;
更改由值“462368EA9F7AD215”标识的用户 ORDSYS;
更改由值“462368EA9F7AD215”标识的用户 DVF;
更改由值“462368EA9F7AD215”标识的用户 SYSDG; ....

【问题讨论】:

  • 你能把这段代码放在一个脚本中,然后在 SQL 提示符下用@ 运行脚本吗?

标签: oracle plsql spool


【解决方案1】:

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

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

如果您将该代码粘贴到 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

silent 标志也会抑制 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多