首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Oracle假脱机中删除PL/SQL代码

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

Stack Overflow用户
提问于 2016-04-07 09:13:52
回答 1查看 1.4K关注 0票数 1

执行以下代码会在outputfile 'user.sql‘中隐藏PL/SQL代码。有办法从输出文件中删除PL/SQL代码吗?只有“更改用户.”语句必须留在outputfile中。

代码语言:javascript
复制
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开始4 /*检查版本/5选择Version 6进入vVersion 7 来自PRODUCT_COMPONENT_VERSION的产品,如‘%OracleDatabase12c%’;8-9-10/循环,通过用户*/ 11 FOR i IN (从DBA_USERS_WITH_DEFPWD选择* 12 ) 13 循环14 /*基于vVersion为当前用户打印语句*/ 15 IF (vVersion = '12.1.0.2.0') 16 然后是17 DBMS_OUTPUT.put_line ( 18 'Alter‘19 user’19 values i.username 20 values‘),由值’21 values‘462368EA9F7AD215’‘22标识。 \x{e76f}\x{e76f} ';');23其他24 DBMS_OUTPUT.put_line ( 25 ) 'Alter‘26 IF i.username 27 Invalid’由值‘28 AC.26’无效密码‘29 \_ 更改由值‘462368EA9F7AD215’标识的用户MDSYS; 更改由值‘462368EA9F7AD215’标识的用户OLAPSYS; 更改由值‘462368EA9F7AD215’标识的用户LBACSYS; 更改由值‘462368EA9F7AD215’标识的用户ORDDATA; 更改由值‘462368EA9F7AD215’标识的用户ORDSYS; 更改由值‘462368EA9F7AD215’标识的用户DVF; 由值‘462368EA9F7AD215’标识的Alter;

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-07 11:08:22

对于交互式会话,SQL*Plus不支持set echo off。我是记录在案

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

如果将代码粘贴到SQL会话中,您将看到这种行为。如果您执行输入重定向(例如从Linux命令行),您也会看到它:

代码语言:javascript
复制
sqlplus user/passwd@tns < script.sql

您也会看到许多"SQL>“提示回显到终端,还有ALTER语句。

您可以使用静默标志:

代码语言:javascript
复制
sqlplus -s user/passwd@tns < script.sql

或者以脚本的形式运行,而不是以交互方式运行(尽管您需要在脚本的末尾添加一个exit,否则它在等待您键入该脚本时会出现挂起):

代码语言:javascript
复制
sqlplus user/passwd@tns @script.sql

或两者兼备:

代码语言:javascript
复制
sqlplus -s user/passwd@tns @script.sql

沉默标志也会抑制SQL*Plus横幅,因此它将减少总体混乱--尽管这些横幅不会出现在假脱机文件中。

与问题无关,但您不需要将命令放到文件中,然后作为脚本运行。您可以直接以动态SQL的形式运行alter命令:

代码语言:javascript
复制
   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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36471650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档