执行以下代码假脱机输出文件' 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'; ....
答案 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;