正在从 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;
执行以下代码会假脱机输出文件 '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;