Oracle plsql switch case 和 sqlplus 假脱机
Oracle plsql switch case and sqlplus spool
以下查询在 THAN 语句处运行时出错。是否可以在 THAN 语句中使用 select?关于如何使其工作的任何想法?
SET SERVEROUTPUT ON
SET TERMOUT OFF
SET ECHO OFF
SET FEEDBACK OFF
SET LINESIZE 140
SET PAGESIZE 0
exec dbms_output.enable(NULL);
SPOOL C:\test\user.sql
BEGIN
SELECT DISTINCT version,
CASE
WHEN version = '12.1.0.2.0'
THEN
dbms_output.put_line(''select' || 'Alter user ' || username || ' identified by values ' || '''EE3FD1E715941451''' || ';''); from DBA_USERS_WITH_DEFPWD;
ELSE
dbms_output.put_line(''select' || 'Alter user ' || username || ' identified by values ' || '''Invalid Password''' || ';''); from DBA_USERS_WITH_DEFPWD;
FROM PRODUCT_COMPONENT_VERSION;
END;
SPOOL OFF
编辑:
正在运行的代码如下所示:
spool c:/test/user.sql
select 'Alter user ' || username || ' identified by values ' || '''Invalid Password''' || ';'
from DBA_USERS_WITH_DEFPWD;
spool off
假脱机输出示例:
Alter user GSMUSER identified by values 'Invalid Password';
Alter user MDSYS identified by values 'Invalid Password';
Alter user OLAPSYS identified by values 'Invalid Password';
Alter user LBACSYS identified by values 'Invalid Password';
该脚本不适用于新的 Oracle 数据库版本。从 Oracle 12.1.0.2.0 开始,无法将密码设置为无效密码。我需要为这个问题建立版本识别。所有版本低于 12.1.0.2.0 的 Oracle 数据库都应使用旧脚本处理,密码应设置为“无效密码”。所有较新的版本现在都应该获得某种标准密码。
也许你需要这样的东西:
...
DECLARE
vVersion varchar2(100);
BEGIN
/* get the version */
SELECT DISTINCT version
into vVersion
from PRODUCT_COMPONENT_VERSION;
--
/* loop through users */
for i in ( select * from DBA_USERS_WITH_DEFPWD) loop
/* print a different 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 ' || '''EE3FD1E715941451''' || ';');
else
dbms_output.put_line('Alter user ' || i.username || ' identified by values ' || '''Invalid Password''' || ';');
end if;
end loop;
END;
...
如果无法使用PL/SQL:
SET TERMOUT OFF
SET ECHO OFF
SET LINESIZE 140
SET FEEDBACK OFF
SET PAGESIZE 0
spool user.sql
SELECT 'Alter user '
|| A.USERNAME
|| ' identified by values '
|| '''EE3FD1E715941451'''
|| ';'
FROM DBA_USERS_WITH_DEFPWD a,
(SELECT DISTINCT version
FROM PRODUCT_COMPONENT_VERSION) b
WHERE version = '12.1.0.2.0'
UNION ALL
SELECT 'Alter user '
|| A.USERNAME
|| ' identified by values '
|| '''Invalid Password'''
|| ';'
FROM DBA_USERS_WITH_DEFPWD a,
(SELECT DISTINCT version
FROM PRODUCT_COMPONENT_VERSION) b
WHERE version != '12.1.0.2.0';
spool off
@user.sql
另一个版本解决了没有 PL/SQL 和正确假脱机的问题:
SET TERMOUT OFF
SET ECHO OFF
SET LINESIZE 140
SET FEEDBACK OFF
SET PAGESIZE 0
SPOOL user.sql
SELECT 'alter user ' || username || ' identified by values '''
|| CASE
WHEN b.version = '12.1.0.2.0' THEN '462368EA9F7AD215'
ELSE 'Invalid Password'
END
|| ''';'
FROM DBA_USERS_WITH_DEFPWD a,
(SELECT VERSION
FROM PRODUCT_COMPONENT_VERSION
WHERE UPPER (product) LIKE '%DATABASE%') b;
SPOOL OFF
@user.sql
以下查询在 THAN 语句处运行时出错。是否可以在 THAN 语句中使用 select?关于如何使其工作的任何想法?
SET SERVEROUTPUT ON
SET TERMOUT OFF
SET ECHO OFF
SET FEEDBACK OFF
SET LINESIZE 140
SET PAGESIZE 0
exec dbms_output.enable(NULL);
SPOOL C:\test\user.sql
BEGIN
SELECT DISTINCT version,
CASE
WHEN version = '12.1.0.2.0'
THEN
dbms_output.put_line(''select' || 'Alter user ' || username || ' identified by values ' || '''EE3FD1E715941451''' || ';''); from DBA_USERS_WITH_DEFPWD;
ELSE
dbms_output.put_line(''select' || 'Alter user ' || username || ' identified by values ' || '''Invalid Password''' || ';''); from DBA_USERS_WITH_DEFPWD;
FROM PRODUCT_COMPONENT_VERSION;
END;
SPOOL OFF
编辑:
正在运行的代码如下所示:
spool c:/test/user.sql
select 'Alter user ' || username || ' identified by values ' || '''Invalid Password''' || ';'
from DBA_USERS_WITH_DEFPWD;
spool off
假脱机输出示例:
Alter user GSMUSER identified by values 'Invalid Password';
Alter user MDSYS identified by values 'Invalid Password';
Alter user OLAPSYS identified by values 'Invalid Password';
Alter user LBACSYS identified by values 'Invalid Password';
该脚本不适用于新的 Oracle 数据库版本。从 Oracle 12.1.0.2.0 开始,无法将密码设置为无效密码。我需要为这个问题建立版本识别。所有版本低于 12.1.0.2.0 的 Oracle 数据库都应使用旧脚本处理,密码应设置为“无效密码”。所有较新的版本现在都应该获得某种标准密码。
也许你需要这样的东西:
...
DECLARE
vVersion varchar2(100);
BEGIN
/* get the version */
SELECT DISTINCT version
into vVersion
from PRODUCT_COMPONENT_VERSION;
--
/* loop through users */
for i in ( select * from DBA_USERS_WITH_DEFPWD) loop
/* print a different 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 ' || '''EE3FD1E715941451''' || ';');
else
dbms_output.put_line('Alter user ' || i.username || ' identified by values ' || '''Invalid Password''' || ';');
end if;
end loop;
END;
...
如果无法使用PL/SQL:
SET TERMOUT OFF
SET ECHO OFF
SET LINESIZE 140
SET FEEDBACK OFF
SET PAGESIZE 0
spool user.sql
SELECT 'Alter user '
|| A.USERNAME
|| ' identified by values '
|| '''EE3FD1E715941451'''
|| ';'
FROM DBA_USERS_WITH_DEFPWD a,
(SELECT DISTINCT version
FROM PRODUCT_COMPONENT_VERSION) b
WHERE version = '12.1.0.2.0'
UNION ALL
SELECT 'Alter user '
|| A.USERNAME
|| ' identified by values '
|| '''Invalid Password'''
|| ';'
FROM DBA_USERS_WITH_DEFPWD a,
(SELECT DISTINCT version
FROM PRODUCT_COMPONENT_VERSION) b
WHERE version != '12.1.0.2.0';
spool off
@user.sql
另一个版本解决了没有 PL/SQL 和正确假脱机的问题:
SET TERMOUT OFF
SET ECHO OFF
SET LINESIZE 140
SET FEEDBACK OFF
SET PAGESIZE 0
SPOOL user.sql
SELECT 'alter user ' || username || ' identified by values '''
|| CASE
WHEN b.version = '12.1.0.2.0' THEN '462368EA9F7AD215'
ELSE 'Invalid Password'
END
|| ''';'
FROM DBA_USERS_WITH_DEFPWD a,
(SELECT VERSION
FROM PRODUCT_COMPONENT_VERSION
WHERE UPPER (product) LIKE '%DATABASE%') b;
SPOOL OFF
@user.sql