ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 


SQL> CREATE DOMAIN TIME_DOM IS TIME ( 2 ) DEFAULT '00:00:00.00' ;
%SQL-F-DEFVALINC, You specified a default value for TIME_DOM which is
inconsistent with its data type
SQL> CREATE DOMAIN TIME_DOM IS TIME ( 2 ) DEFAULT TIME '00:00:00.00' ;

  • ALTER DOMAIN文を使用して、ドメイン名に関連付けられているキャラクタ・セットを変更できます。ただし、ドメイン名を使用してデータを表に入力した後に変更を実行する場合、表から行を選択しようとすると、SQLからデータ変換エラーが返されます。

  • NCHAR、NATIONAL CHAR、NCHAR VARYINGまたはNATIONAL CHAR VARYINGデータ型を使用すると、各国語キャラクタ・データ型を指定できます。各国語キャラクタ・データ型は、データベースの作成時に、データベース各国語キャラクタ・セットによって定義されます。各国語キャラクタ・データ型の詳細は、第2.3節を参照してください。

  • データ型の長さは、文字またはオクテットで指定できます。デフォルトでは、データ型はオクテットで指定されます。ALTER DOMAIN文をSET CHARACTER LENGTH 'CHARACTERS'文とともに前に配置すると、長さを文字数に変更できます。SET DIALECTでも、デフォルトの文字長を変更できます。詳細は、「SET CHARACTER LENGTH文」および「SET DIALECT文」を参照してください。

  • ドメインのデフォルト値として使用する値がある場合は、どのような値であるかを考慮する必要があります。NULLやNot Applicableなどの値を使用し、そのドメインに基づく列へのデータ挿入が行われないことを明確に示すことができます。通常、列に特定の値が含まれる場合は、その値をデフォルトとして使用できます。たとえば、従業員のほとんどが同じ州に住んでいる場合は、その州をSTATE_DOM列のデフォルト値にできます。
    列に指定したデフォルト値は、ドメインに指定したデフォルト値より優先されます。
    デフォルト値を削除するには、DROP DEFAULT句を使用します。
    ドメインのデフォルト値を変更または追加する場合、変更によるデータベース内の既存データに対する影響はありません。つまり、データベース内に列とともに格納されており、古いデフォルト値を含む行は変更されません。

  • FROM句によって(リポジトリ定義に基づいて)作成されたドメインに対する変更は、他のアプリケーションに影響する可能性があります。データベースがPATHNAME句で宣言されている場合、ALTER DOMAIN文で実行された変更は即時にリポジトリ・レコードまたはフィールド定義に書き込まれます。データベースがFILENAME句で宣言されている場合は、次にINTEGRATE SCHEMA...ALTER DICTIONARY文が発行されたときに変更がリポジトリに書き込まれます。
    この変更は、アプリケーションを再コンパイルする場合や、データベースをリポジトリに集約する場合に、同じリポジトリ定義を使用するアプリケーションや他のデータベースに影響を及ぼします。
    このため、リポジトリ定義に基づくドメインを変更する場合には注意が必要です。ALTER DOMAIN文による変更が、リポジトリ定義を共有する他のユーザーまたはアプリケーションに想定外の影響を及ぼしていないことを確認してください。

  • ALTER DOMAIN文は、読取り/書込みトランザクションで実行する必要があります。アクティブなトランザクションがない場合にこの文を発行すると、SQLでは、直近のDECLARE TRANSACTION文で指定された特性を持つトランザクションが開始されます。

  • レコードの検索時に、変換エラーの原因となるALTER DOMAIN操作を実行すると仮定します。このエラーを回避するため、レコードの削除を試行する場合があります。これは削除操作でも同じように不正に変換されるため、正しく動作しません。
    この問題を回避するには、ドメインをオリジナルのデータ型に戻してから、原因となっているレコードを削除または変更します。次に、ALTER DOMAIN文を使用して、ドメインを目的のデータ型に変更します。

  • ドメイン絞込み条件を追加すると、条件には副問合せが含まれなくなるため、別のドメインを参照できなくなります。

  • 各ドメインに対し、1件のみ絞込み条件を指定できます。

  • CHECK制約構文では、VALUEキーワードまたはドメイン名を参照できます。次に例を示します。


    SQL> -- The CHECK constraint can reference the VALUE keyword.
    SQL> --
    SQL> ALTER DOMAIN D1 INTEGER
    cont> ADD CHECK (VALUE > 10)
    cont> NOT DEFERRABLE;
    SQL> SHOW DOMAIN D1;
    D1                              INTEGER
     Valid If:       (VALUE > 10)
    SQL> ROLLBACK;
    SQL> --
    SQL> -- The CHECK constraint can reference the domain name.
    SQL> --
    SQL> ALTER DOMAIN D1 INTEGER
    cont> ADD CHECK (D1 > 10)
    cont> NOT DEFERRABLE;
    SQL> SHOW DOMAIN D1
    D1                              INTEGER
     Valid If:       (D1 > 10)
    

  • 最初に条件を削除せずに、NOT NULL制約を参照してドメインのデータ型を変更できます。

  • トリガー定義で使用されている列に参照されるドメインのデータ型を変更し、そのトリガーを無効にできます。既存のデータによって、データ型の変更後にトリガーが妨害される可能性があります。トリガー定義の列で参照されるドメインを変更する前に、新規データ型とあらかじめ定義されているトリガーが一致するかどうかを確認します。

  • ドメインの変更にALTER DOMAIN文を使用すると、その属性が自動的に参照しているすべての表およびビューに伝播されます。
    たとえば、ドメインのデータ型を変更すると、Oracle Rdbによって、直接的または間接的にそのドメインを参照する表示列が更新され、ドメインの新規属性が反映されます。(表示列は、そのドメインを使用する実表の列を参照する式を使用すると、間接的にドメインを参照できます。)


    例1: ドメインPOSTAL_CODE_DOMの変更

    この例では、ドメインPOSTAL_CODE_DOMを変更し、より長い郵便番号を受け入れるようにします。


    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
    

    例2: ドメインID_DOMの変更

    次の例では、従業員識別子フィールドの標準として定義されているドメインID_DOMのデータ型を変更します。

    例1では、ドメインPOSTAL_CODE_DOMに基づく索引は存在しませんでした。この例では、列を参照する複数の索引がID_DOMに基づいて作成されています。次の例に示すように、ドメインを変更する前に索引を削除する必要があります。


    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
    
    

    例3: ALTER DOMAIN文によるデフォルト値の指定

    次の例では、ドメインが変更され、それらのドメインに対してデフォルト値が指定されています。


    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';
    

    例4: ALTER DOMAIN文による編集文字列の指定

    次の例では、ドメインMIDDLE_INITIAL_DOMに基づく列をSQLでどのように表示するかを制御するEDIT STRING句を指定します。この例の編集文字列X.?'No middle initial'では、ドメインに基づく列が、後にピリオドの付いた1文字として表示されるように指定します。この列に対する値が存在しない場合、SQLにより疑問符の後に文字列'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
            .
            .
            .
    

    例5: ALTER DOMAIN文による新規照合順番の指定

    次の例では、事前定義されたNCS照合順番FRENCHを指定したドメインが作成されます。最初に、CREATE 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)
    
    

    例6および7については、次を前提とします。

    • データベースは、データベースのデフォルト・キャラクタ・セットをDEC_KANJI、各国語キャラクタ・セットをKANJIと指定して作成されています。

    • ドメインDEC_KANJI_DOMは、データベースのデフォルト・キャラクタ・セットを指定して作成されています。

    • 表COLOURSは、DEC_KANJI_DOMドメインを列ROMAJIに割り当てて作成されています。

    例6: ドメイン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>
    

    例7: データを含む表で使用されるドメインの変更エラー

    次の例では、列ROMAJIはドメインDEC_KANJI_DOMに基づきます。ドメインのキャラクタ・セットを変更する前に列ROMAJIにデータが含まれている場合は、ドメイン変更後にデータ検索を試行すると、SQLによって次のエラーが表示されます。


    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>
    

    例8: ドメイン制約の変更

    次の例では、ドメインの既存の制約をどのように変更するかを示します。


    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;
    

    例9: ストアド・プロシージャ・ドメイン依存性の作成

    次のストアド・モジュールのコード部分は、パラメータ・リスト内のドメインおよびストアド・プロシージャ・ブロック内のドメインを示します。


    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);
    

    • パラメータ・リストで指定されたドメイン
      ストアド・ルーチンのパラメータ・リスト(id_number)でドメインを指定し、続いてそのドメインを変更しようとすると、SQLではドメインとドメインが存在するストアド・ルーチン間に依存性が設定されているため、ALTER DOMAIN文は失敗します。文が失敗するため、Oracle Rdbではストアド・ルーチンが無効化されません。Oracle Rdbでは、このドメイン・パラメータ・リスト依存性がRDB$PARAMETERSに保持されます。

    • ストアド・ルーチン・ブロックで指定されたドメイン
      ストアド・ルーチン・ブロック内でドメイン(last_name)を指定し、続いてそのドメインを変更する場合は、ALTER DOMAIN文が正常に実行されます。さらにストアド・ルーチンを呼び出すと、ドメインの新規の定義が使用されます。

    例10: デフォルト値を指定するためのドメイン変更

    この例では、ドメインに追加されたデフォルト値がそのドメインを使用して表に伝播されることを示します。


    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
    


    ALTER FUNCTION文

    CREATE MODULE文またはCREATE FUNCTION文を使用して作成されたファンクションの属性を変更できます。

    次のように使用できます。

    • 強制的なストアド(SQL)・ファンクションのコンパイル(COMPILEオプション)

    • 外部ファンクションの属性変更

    • ファンクションのコメント変更


    環境

    ALTER FUNCTION文は次の環境で使用できます。

    • 対話型SQL内

    • ホスト言語プログラムに埋め込まれる場合

    • SQLモジュールのプロシージャの一部として

    • 動的SQLで動的に実行される文として


    形式







    引数

    BIND ON CLIENT SITE

    BIND ON SERVER SITE

    外部ルーチン実行の実行モデルおよび環境を選択します。

    CLIENTサイト・バインディングにより、外部ルーチンがアクティブ化され、OpenVMSデータベース・クライアント(アプリケーション)・プロセスで実行されます。これはデフォルトのバインディングです。このバインディングによって最も効率的な実行特性が提供され、I/Oデバイスなどのリソースを共有し、外部ルーチンをクライアント・アプリケーションの一部と同様にデバッグできます。ただし、このバインディングはアドレス空間の制限を受ける場合があります。データベース・バッファと仮想メモリーを共有しているため、このバインディングはクライアント・プロセスのシステム・ユーザー環境に限定されており、高レベルの権限が必要なアプリケーションの実行時に、外部ルーチンを実行することは禁止されています。

    SERVERサイト・バインディングにより、外部ルーチンがデータベース・クライアントおよびサーバーとは別のプロセスでアクティブ化されます。このプロセスは、データベース・プロセスと同じノードで開始されます。このバインディングでは、適切な実行特性、より大きいアドレス空間、実際のセッション・ユーザー環境が提供され、高レベルの権限によるクライアント・プロセス制約を受けません。ただし、このバインディングでは、クライアントとI/Oデバイスなどのリソースを共有できないため(特に、クライアント対話型端末への接続がないため)、一般的にルーチンをデバッグできません。

    BIND SCOPE CONNECT

    BIND SCOPE TRANSACTION

    外部ルーチンがアクティブ化される有効範囲と、外部ルーチンが非アクティブ化されるポイントを定義します。デフォルトの有効範囲はCONNECTです。

    • CONNECT
      データベースからデタッチする(またはデタッチせずに終了する)と、アクティブなルーチンが非アクティブ化されます。

    • TRANSACTION
      トランザクションが中止(COMMITまたはROLLBACK)されると、アクティブなルーチンが非アクティブ化されます。トランザクションを実行していない場合、有効範囲はCONNECTに戻ります。

    COMMENT IS string

    ファンクションに関するコメントを追加します。SQLでは、SHOW FUNCTIONS文の実行時にコメントのテキストが表示されます。コメントは一重引用符(')で囲み、コメント内の複数の行はスラッシュ(/)で区切ります。

    この句は、COMMENT ON FUNCTION文と同義です。

    COMPILE

    COMPILEオプションにより、Oracle Rdbサーバーで強制的にストアド(SQL)・ファンクションを再コンパイルします。外部ファンクションには反映されません。

    DROP...CASCADE操作の実行によってファンクションが無効化されている場合は、COMPILEを使用します。このメカニズムは、以前のバージョンで使用可能なSET FLAGS 'VALIDATE_ROUTINE'メソッドより優先されます。

    DEFAULT LOCATION

    LOCATION 'image-location'

    外部ルーチン・イメージのデフォルトの位置または特定の位置です。結果ファイルの仕様には、タイプ.exeが含まれている必要があります。

    これは、イメージ・ファイルの仕様または単に論理名になります。

    SQLでは、次の要素の組合せに基づいてルーチンを選択します。

    • Image string
      位置はDEFAULT LOCATIONにデフォルトで設定されます。これはファイル仕様文字列RDB$ROUTINESを表します。

    • Logical name translation
      WITH ALL LOGICAL_NAME TRANSLATION句およびWITH SYSTEM LOGICAL_NAME TRANSLATION句によって、ロケーション文字列にある論理名の変換方法を指定します。
      変換オプションが指定されていない場合、またはWITH ALL LOGICAL_NAME TRANSLATIONが指定されている場合は、論理名はデフォルトの方法で変換されます。
      If WITH SYSTEM LOGICAL_NAME TRANSLATIONが指定されている場合は、ロケーション文字列の論理名は、SYSTEM論理名表のEXECUTIVE_MODE論理名のみを使用して展開されます。

    DETERMINISTIC

    NOT DETERMINISTIC

    これらの句は、SQL/PSM規格への準拠において、VARIANT句およびNOT VARIANT句と同義です。

    DETERMINISTIC句は、ファンクションに対する入力が同じであれば、出力も同じになることを示します。これはNOT VARIANT句と同義です。

    NOT DETERMINISTIC句は、ファンクションの出力は、その入力に依存しないことを示します。これはVARIANT句と同義です。

    external-body-clause

    ルーチン名、ルーチンの実行可能イメージの位置、ルーチンをコーディングする言語など、ルーチンのキー特性を識別します。

    external-body-name

    外部ルーチン名です。この名前を指定しない場合は、external-routine-name句で指定した名前がSQLに使用されます。

    この名前により、ルーチン本体の起動ごとにコールされるルーチン・エントリ・アドレスが定義されます。location句で選択された外部ルーチン・イメージには、この名前付きルーチンが必要です。

    引用符付きでない名前は、大文字に変換されます。

    LANGUAGE language-name

    外部ルーチンがコーディングされたホスト言語の名前です。ADA、C、COBOL、FORTRAN、PASCALまたはGENERALを指定できます。GENERALキーワードを使用すると、任意の言語で記述したルーチンをコールできます。

    言語固有の情報の詳細は、「使用方法」を参照してください。

    notify-clause

    特定の外部ルーチンまたはデータベース関連のイベントが発生した場合に、2番目に呼び出される(通知される)ルーチンの名前を指定します。この名前により、通知ルーチンの起動ごとにコールされるルーチン・エントリ・アドレスが定義されます。location句で選択された外部ルーチン・イメージには、この名前付きルーチンが必要です。

    通知ルーチンに関連するイベントはON BIND、ON CONNECTおよびON TRANSACTIONです。複数のイベントを指定できます。

    次に、イベントと各イベントの有効範囲について説明します。

      BIND ルーチンのアクティブ化からルーチンの非アクティブ化
      CONNECT データベース・アタッチからデータベース切断
      TRANSACTION 開始トランザクションからコミットまたはロールバック・トランザクション

    RENAME TO

    変更中のファンクション名を変更します。詳細は、「RENAME文」を参照してください。新規名がシノニム名である場合は、エラーが発生します。

    RETURNS NULL ON NULL INPUT

    CALLED ON NULL INPUT

    これらの句では、1つ以上のファンクション引数がNULLの場合に、外部ファンクションの起動方法を制御します。CALLED ON NULL INPUT句では、ファンクションが正常に実行されることを指定します。PARAMETER STYLE GENERAL句が指定された場合の正常実行は、NULL値が検出された場合の、SQLによるランタイム・エラーを返す方法の指定です。

    RETURNS NULL ON NULL INPUT句により、Oracle Rdbに対してファンクションを回避し、単にNULLを返すよう指示されます。このオプションはSIN、COS、CHECKSUM、SOUNDEXなど、通常、引数がNULLの場合にUNKNOWNを返すライブラリ・ファンクションで有用です。

    デフォルトはCALLED ON NULL INPUT句です。

    VARIANT

    NOT VARIANT

    これらの句は、SQL/PSM規格への準拠において、DETERMINISTIC句およびNOT DETERMINISTIC句と同義です。DETERMINISTIC句は、ファンクションに対する入力が同じであれば、出力も同じになることを示します。これはNOT VARIANT句と同義です。NOT DETERMINISTIC句は、ファンクションの出力は、その入力に依存しないことを示します。これはVARIANT句と同義です。

    使用方法

    • この文を実行するには、指定したプロシージャに対するALTER権限が必要です。プロシージャがモジュールの一部である場合は、そのモジュールに対するALTER権限が必要です。

    • COMPILE句、COMMENT句、VARIANT句、DETERMINISTIC句およびRENAME TO句を除き、ALTER FUNCTION文の属性はすべて、外部ファンクションにのみ適用されます。被参照ファンクションがSQLストアド・ファンクションである場合はエラーが返されます。

    • ALTER FUNCTION文によって、名前付きファンクション用のRDB$ROUTINES表のRDB$LAST_ALTERED列がトランザクションのタイムスタンプで更新されます。

    • RENAME TO句には、このデータベースに対して有効なシノニムが必要です。「ALTER DATABASE文」のSYNONYMS ARE ENABLED句に関する説明を参照してください。これらのシノニムがデータベース定義またはアプリケーションによって使用されていない場合は、削除される可能性があります。

    • ルーチンに多くの依存性がある場合は、DROP...CASCADEコマンド・シーケンスおよびCREATEコマンド・シーケンスよりALTERが優先的に使用されます。ALTERには、このルーチンと任意のトリガー、ストアド・ルーチンまたは他のデータベース・オブジェクトとの間に存在する既存の依存性情報が保持されているためです。


    例1: ファンクションのNOT DETERMINISTICへの変更

    ファンクションが作成された場合、DETERMINISTICであると仮定します。つまり、入力値が同じであれば、同じ結果が返されることを意味します。次に示すGET_TIMEファンクションなどのパラメータがルーチンにない場合、異なるものは入力できません。この場合、このファンクションは、以前に返された行ごとの結果を使用するのではなく、行の処理ごとにRdbオプティマイザによってファンクションが呼び出されるようにNOT DETERMINISTICとして定義する必要があります。

    DROP FUNCTIONおよびCREATE FUNCTIONは同じファンクションを実行できますが、ALTER FUNCTIONではデータベース内に存在する依存性が保持されます。


    SQL> alter function GET_TIME
    cont>     not deterministic
    cont>     comment 'Fetch time from clock'
    cont>     /       'Every call must be executed, so change to be'
    cont>     /       'NOT DETERMINISTIC';
    SQL>
    SQL> show function GET_TIME;
    Information for function GET_TIME
    
     Function is Not Deterministic (variant)
     Function ID is: 262
     External Location is: SYS$SHARE:CLOCKSHR.EXE
     Entry Point is: GET_TIME
     Comment:       Fetch time from clock
                    Every call must be executed, so change to be
                    NOT DETERMINISTIC
     Language is: COBOL
     GENERAL parameter passing style used
     Number of parameters is: 0
    
    Parameter Name                  Data Type        Domain or Type
    --------------                  ---------        --------------
                                    TIME(2)
            Function result datatype
            Return value is passed by value