2016-03-31 4 views
2

Следующий запрос выполняется при ошибке в инструкции THAN. Можно ли использовать select в заявлении THAN? Любые идеи о том, как заставить его работать?Корпус коммутатора Oracle plsql и катушка sqlplus

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 

Edit:

код, который работает, выглядит так:

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 DB. Поскольку Oracle 12.1.0.2.0 невозможно установить пароль на неверный пароль. Мне нужно создать идентификатор версии для этой проблемы. Все базы данных Oracle с версией ниже 12.1.0.2.0 должны обрабатываться старым скриптом, а пароли должны быть установлены на «неверный пароль». Все новые версии должны получить какой-то стандартный пароль.

+0

Вы не можете использовать DBMS_OUTPUT в инструкции SELECT. вы смешиваете SQL и PL/SQL. Это разные двигатели. Кроме того, ваш оператор SELECT на самом деле не имеет смысла. Объясните свое требование правильными словами. –

+0

Можете ли вы разместить некоторые данные образца и желаемый результат? – Aleksej

+0

@LalitKumarB он пытается это сделать: http://stackoverflow.com/questions/36302810/switch-case-for-oracle-versions-to-set-invalid-passwords-for-standard-users – Sathya

ответ

4

Может быть, вам нужно что-то вроде этого:

... 
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; 
... 
+0

Спасибо, это то, что я пытался сделать. Выполнение скрипта дает мне еще некоторые проблемы. Он просит меня объявить версию и имя пользователя. Версия может быть исправлена ​​путем изменения if (version = '12 .1.0.2.0 ') на if (vVersion = '12 .1.0.2.0'). Но я не могу исправить имя пользователя. В настоящее время он, похоже, не принимает имя пользователя из DBA_USERS_WITH_DEFPWD. Я еще не нашел способа исправить это. – r0tt

+0

Две ошибки мин, только что отредактированные, чтобы исправить – Aleksej

+0

Необходимо использовать SET SERVEROUTPUT ON для получения вывода на катушку. – r0tt

0

Если это не представляется возможным использовать 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 
0

Другой вариант, который решает эту проблему без 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 
Смежные вопросы