PURPOSE
 
  To explain how to change the database or national character set of
  an existing Oracle8 database without having to recreate the database.


SCOPE & APPLICATION
 
  The method described here is documented in the Oracle 8.1.x documentation.
  It is not documented but it can be used in version 8.0.x.

  Before using this method it is essential to do a full backup of the 
  database.

  This method does not work in Oracle7.

  Note that changing the database or the national character set as described 
  in this document does not change the actual character codes, it only
  changes the character set declaration. If you want to convert the contents
  of the database (character codes) from one character set to another
  you must use the Oracle Export and Import utilities. This is needed,
  for example, if the source character set is not a binary subset of
  the target character set, i.e. if a character exists in the source
  and in the target character set but not with the same binary code.




CHANGING THE DATABASE OR NATIONAL CHARACTER SET
================================================

 
In Oracle8 there is another way of changing the database or national character 
set.  The method uses two commands, which are documented in the Oracle8i 
National Language Support Guide:
 
   ALTER DATABASE [<db_name>] CHARACTER SET <new_character_set> 
   ALTER DATABASE [<db_name>] NATIONAL CHARACTER SET <new_NCHAR_character_set> 

The database name is optional.  The character set name should be specified 
without quotes, for example: 

    ALTER DATABASE CHARACTER SET WE8ISO8859P1

To change the database character set perform the following steps.  
Note that some of them have been erroneously omitted from the Oracle8i
documentation:

The following steps below you have to follow :

  1. Make sure the parallel_server parameter in INIT.ORA is set to false
     or it is not set at all.

  2. Execute the following commands in Server Manager (svrmgrl):

     SVRMGR> SHUTDOWN IMMEDIATE;   -- or NORMAL

         <do a full database backup>

     SVRMGR> STARTUP MOUNT; 
     SVRMGR> ALTER SYSTEM ENABLE RESTRICTED SESSION; 
     SVRMGR> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; 
     SVRMGR> ALTER SYSTEM SET AQ_TM_PROCESSES=0; 
     SVRMGR> ALTER DATABASE OPEN; 
     SVRMGR> ALTER DATABASE CHARACTER SET WE8ISO8859P1;
     SVRMGR> ALTER DATABASE NATIONAL CHARACTER SET WE8ISO8859P1;
     SVRMGR> SHUTDOWN IMMEDIATE;    -- OR NORMAL
     SVRMGR> STARTUP RESTRICT; 

  3. Restore the parallel_server parameter in INIT.ORA, if necessary.

  4. Execute the following commands in Server Manager:

     SVRMGR> SHUTDOWN IMMEDIATE;    -- OR NORMAL
     SVRMGR> STARTUP; 

     The double restart is necessary because of a SGA initialization bug,
     fixed in Oracle9i.
 
To change the national character set replace the ALTER DATABASE CHARACTER
SET command with ALTER DATABASE NATIONAL CHARACTER SET.  You can issue both
commands together if you wish.

The ALTER DATABASE [NATIONAL] CHARACTER SET command will return:

    ORA-01679: database must be mounted EXCLUSIVE and not open to activate

    - if you do not enable restricted session
    - if you startup the instance in PARALLEL/SHARED mode
    - if you do not set the number of queue processes to 0
    - if you do not set the number of AQ time manager processes to 0
    - if anybody is logged in apart from you.

This error message is misleading.  The command requires the database to be
open but only one session, the one executing the command, is allowed.
The above method will only work if the old character set is US7ASCII (or if 
you change the character set to itself).  If the old character set is neither 
US7ASCII nor equal to the new character set, the ALTER DATABASE [NATIONAL] 
CHARACTER SET command will return:
    
    - in Oracle 8.1.5 and above:

      ORA-12712: new character set must be a superset of old character set

    - in Oracle 8.0.5 and 8.0.6:

      ORA-12710: new character set must be a superset of old character set

    - in Oracle 8.0.3 and 8.0.4:

      ORA-24329: invalid character set identifier
.