Example 1: Altering the domain POSTAL_CODE_DOM This example alters the domain POSTAL_CODE_DOM so that it accommodates longer postal codes: SQL> -- SQL> -- The data type of the current domain POSTAL_CODE_DOM is CHAR(5): SQL> -- SQL> SHOW DOMAIN POSTAL_CODE_DOM POSTAL_CODE_DOM CHAR(5) Comment: standard definition of ZIP Rdb default: SQL> -- SQL> -- Now, alter the domain to accommodate larger postal codes: SQL> -- SQL> ALTER DOMAIN POSTAL_CODE_DOM IS CHAR(10); SQL> -- SQL> -- The SHOW TABLES statement shows how changing the SQL> -- domain POSTAL_CODE_DOM changes all the SQL> -- columns that were created using the domain: SQL> -- SQL> SHOW TABLE COLLEGES Information for table COLLEGES Comment on table COLLEGES: names and addresses of colleges attended by employees Columns for table COLLEGES: Column Name Data Type Domain ----------- --------- ------ . . . POSTAL_CODE CHAR(10) POSTAL_CODE_DOM . . . SQL> SHOW TABLE EMPLOYEES Information for table EMPLOYEES Comment on table EMPLOYEES: personal information about each employee Columns for table EMPLOYEES: Column Name Data Type Domain ----------- --------- ------ . . . POSTAL_CODE CHAR(10) POSTAL_CODE_DOM Example 2: Altering the domain ID_DOM The following example alters the data type for the domain ID_DOM, which is a standard definition of the employee identification field. In Example 1, there were no indexes based on the domain POSTAL_ CODE_DOM. In this example, several indexes that refer to columns were created based on ID_DOM. As the following example shows, you must first delete the indexes before altering the domain: SQL> -- The data type for the domain ID_DOM is CHAR(5): SQL> -- SQL> SHOW DOMAIN ID_DOM ID_DOM CHAR(5) Comment: standard definition of employee id SQL> -- SQL> -- The first attempt to alter the domain ID_DOM fails. SQL> -- You must first delete all constraints that use the SQL> -- field EMPLOYEE_ID. SQL> -- SQL> ALTER DOMAIN ID_DOM CHAR(6); %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-F-FLDINCON, field EMPLOYEE_ID is referenced in constraint RESUMES_FOREIGN1 -RDMS-F-FLDNOTCHG, field EMPLOYEE_ID has not been changed SQL> ALTER TABLE RESUMES DROP CONSTRAINT RESUMES_FOREIGN1; SQL> -- SQL> ALTER DOMAIN ID_DOM IS CHAR(6); %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-F-FLDINCON, field EMPLOYEE_ID is referenced in constraint DEGREES_FOREIGN1 -RDMS-F-FLDNOTCHG, field EMPLOYEE_ID has not been changed SQL> -- SQL> ALTER TABLE DEGREES DROP CONSTRAINT DEGREES_FOREIGN1; . . . SQL> -- You must then delete all indexes. SQL> -- SQL> ALTER DOMAIN ID_DOM IS CHAR(6); %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-F-FLDINUSE, field EMPLOYEE_ID is referenced in index EMP_EMPLOYEE_ID -RDMS-F-FLDNOTCHG, field EMPLOYEE_ID has not been changed SQL> -- SQL> DROP INDEX EMP_EMPLOYEE_ID; SQL> -- SQL> ALTER DOMAIN ID_DOM IS CHAR(6); %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-F-FLDINUSE, field EMPLOYEE_ID is referenced in index JH_EMPLOYEE_ID -RDMS-F-FLDNOTCHG, field EMPLOYEE_ID has not been changed SQL> -- SQL> DROP INDEX JH_EMPLOYEE_ID; SQL> -- . . . SQL> -- SQL> -- You can now alter the domain. SQL> -- SQL> ALTER DOMAIN ID_DOM IS CHAR(6); SQL> SHOW DOMAIN ID_DOM; ID_DOM CHAR(6) Comment: standard definition of employee id Example 3: Specifying default values with the ALTER DOMAIN statement The following example alters domains, specifying default values for those domains: SQL> -- If no date is entered, use the NULL default. SQL> -- SQL> ALTER DOMAIN DATE_DOM cont> SET DEFAULT NULL; SQL> -- SQL> -- If the street address takes only one line, SQL> -- use "NONE" for the default for the second line. SQL> -- SQL> ALTER DOMAIN ADDRESS_DATA_2_DOM cont> SET DEFAULT 'NONE'; SQL> -- SQL> -- If most employees work full-time, make the code SQL> -- for full-time, 1, the default work status. SQL> -- SQL> ALTER DOMAIN STATUS_CODE_DOM cont> SET DEFAULT '1'; Example 4: Specifying an edit string with the ALTER DOMAIN statement The following example specifies an EDIT STRING clause that controls how SQL displays columns based on the domain MIDDLE_ INITIAL_DOM. The edit string in the example, "X.?'No middle initial'", specifies that columns based on the domain are displayed as one character followed by a period. If there is no value for the column, SQL displays the string following the question mark, 'No middle initial'. SQL> ALTER DOMAIN MIDDLE_INITIAL_DOM cont> EDIT STRING 'X.?''No middle initial'; SQL> SELECT MIDDLE_INITIAL FROM EMPLOYEES; MIDDLE_INITIAL A. D. No middle initial No middle initial . . . Example 5: Specifying a new collating sequence with the ALTER DOMAIN statement The following example creates a domain with the predefined NCS collating sequence FRENCH. You must first execute the CREATE COLLATING SEQUENCE statement. The example then changes the collating sequence to Finnish, and then specifies that the domain has no collating sequence. SQL> CREATE COLLATING SEQUENCE FRENCH FRENCH; SQL> CREATE DOMAIN LAST_NAME_ALTER_TEST CHAR (10)- cont> COLLATING SEQUENCE IS FRENCH; SQL> -- SQL> SHOW DOMAIN LAST_NAME_ALTER_TEST LAST_NAME_ALTER_TEST CHAR(10) Collating sequence: FRENCH SQL> -- SQL> -- Now, change the collating sequence to Finnish. You must first SQL> -- execute the CREATE COLLATING SEQUENCE statement. SQL> -- SQL> CREATE COLLATING SEQUENCE FINNISH FINNISH; SQL> ALTER DOMAIN LAST_NAME_ALTER_TEST CHAR (10)- cont> COLLATING SEQUENCE IS FINNISH; SQL> -- SQL> SHOW DOMAIN LAST_NAME_ALTER_TEST LAST_NAME_ALTER_TEST CHAR(10) Collating sequence: FINNISH SQL> -- SQL> -- Now, alter the domain so there is no collating sequence. SQL> -- SQL> ALTER DOMAIN LAST_NAME_ALTER_TEST CHAR (10)- cont> NO COLLATING SEQUENCE; SQL> SQL> SHOW DOMAIN LAST_NAME_ALTER_TEST LAST_NAME_ALTER_TEST CHAR(10) Assume the following for Examples 6 and 7: o The database was created specifying the database default character set as DEC_KANJI and the national character set as KANJI. o The domain DEC_KANJI_DOM was created specifying the database default character set. o The table COLOURS was created assigning the DEC_KANJI_DOM domain to the column ROMAJI. Example 6: Altering the domain DEC_KANJI_DOM SQL> SET CHARACTER LENGTH 'CHARACTERS'; SQL> SHOW DOMAIN DEC_KANJI_DOM; DEC_KANJI_DOM CHAR(8) SQL> ALTER DOMAIN DEC_KANJI_DOM NCHAR(8); SQL> SHOW DOMAIN DEC_KANJI_DOM; DEC_KANJI_DOM CHAR(8) KANJI 8 Characters, 16 Octets SQL> Example 7: Error altering a domain used in a table containing data In the following example, the column ROMAJI is based on the domain DEC_KANJI_DOM. If the column ROMAJI contains data before you alter the character set of the domain, SQL displays the following error when you try to retrieve data after altering the domain. SQL> SELECT ROMAJI FROM COLOURS; %RDB-F-CONVERT_ERROR, invalid or unsupported data conversion -RDMS-E-CSETBADASSIGN, incompatible character sets prohibits the requested assignment SQL> -- SQL> -- To recover, use the ROLLBACK statement or reset the character set to SQL> -- its original value. SQL> -- SQL>ROLLBACK; SQL> SELECT ROMAJI FROM COLOURS; ROMAJI kuro shiro ao aka ki midori 6 rows selected SQL> Example 8: Modifying a domain constraint The following example shows how to modify an existing constraint on a domain: SQL> SHOW DOMAIN TEST_DOM TEST_DOM DATE ANSI Rdb default: NULL VALID IF: (VALUE > DATE'1900-01-01' OR VALUE IS NULL) SQL> -- SQL> -- Add the new domain constraint definition. SQL> -- SQL> ALTER DOMAIN TEST_DOM cont> ADD CHECK (VALUE > DATE'1985-01-01') cont> NOT DEFERRABLE; Example 9: Creating stored procedure domain dependencies The following code fragment from a stored module shows a domain in a parameter list and a domain in a stored procedure block: SQL> create module SAMPLE cont> procedure FIRST_NAME cont> (in :id id_dom cont> ,out :first_name char(40)); cont> begin cont> declare :fn first_name_dom; cont> select first_name into :fn cont> from employees cont> where employee_id = :id; cont> -- return capitalized first name cont> set :first_name = cont> UPPER (substring (:fn from 1 for 1)) || cont> LOWER (substring (:fn from 2)); cont> end; cont> end module; SQL> SQL> declare :first_name first_name_dom; SQL> call FIRST_NAME ('00164', :first_name); FIRST_NAME Alvin SQL> SQL> alter domain id_dom cont> char(10); %RDB-E-NO_META_UPDATE, metadata update failed -RDMS-F-RTNEXI, field "ID_DOM" is used in routine "FIRST_NAME" -RDMS-F-FLDNOTCHG, field ID_DOM has not been changed SQL> SQL> alter domain first_name_dom cont> char(60); o Domain specified in a parameter list When you specify a domain in a parameter list (id_number) of a stored routine and you subsequently try to alter that domain, the ALTER DOMAIN statement fails because SQL sets up a dependency between the domain and the stored routine in which the domain resides. Because the statement fails, Oracle Rdb does not invalidate the stored routine. Oracle Rdb keeps this domain parameter list dependency in RDB$PARAMETERS. o Domain specified in a stored routine block When you specify a domain (last_name) within a stored routine block and you subsequently try to alter that domain, the ALTER DOMAIN statement succeeds. Future calls to the stored routine will use the new definition of the domain. Example 10: Altering a Domain to Provide a Default Value This examples demonstrates that the default value added to the domain is propagated to the tables using that domain. SQL> -- Display the current domain definition. SQL> SHOW DOMAIN DEPARTMENT_NAME DEPARTMENT_NAME CHAR(30) Comment: Department name Missing Value: None SQL> -- Alter the domain to provide a default value SQL> -- for DEPARTMENT_NAME. SQL> ALTER DOMAIN DEPARTMENT_NAME cont> SET DEFAULT 'Not Recorded'; SQL> -- Display the altered domain definition. SQL> SHOW DOMAIN DEPARTMENT_NAME; DEPARTMENT_NAME CHAR(30) Comment: Department name Oracle Rdb default: Not Recorded Missing Value: None SQL> -- Insert a record and omit the value for DEPARTMENT_NAME. SQL> INSERT INTO DEPARTMENTS (DEPARTMENT_CODE) cont> VALUES cont> ('GOGO'); 1 row inserted SQL> COMMIT; SQL> -- Select the newly inserted record to show that the SQL> -- default for the DEPARTMENT_NAME domain was inserted. SQL> SELECT * FROM DEPARTMENTS WHERE DEPARTMENT_CODE='GOGO'; DEPARTMENT_CODE DEPARTMENT_NAME MANAGER_ID BUDGET_PROJECTED BUDGET_ACTUAL GOGO Not Recorded NULL NULL NULL 1 row selected