Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL リファレンス » SQL の使用 » SQL 文 » SQL 文 (A ~ D)

 

CREATE FUNCTION 文 [外部プロシージャ]

この文は、ネイティブ関数または外部関数へのインタフェースを作成するために使用します。ユーザ定義 SQL 関数の作成方法については、CREATE FUNCTION 文を参照してください。

構文
CREATE [ OR REPLACE ] FUNCTION [ owner.]function-name 
( [ parameter, ... ] )
RETURNS data-type 
[ SQL SECURITY { INVOKER | DEFINER } ]
[ [ NOT ] DETERMINISTIC ]
EXTERNAL NAME external-call [ LANGUAGE environment-name  ]
parameter :
   [ IN ] parameter-name data-type [ DEFAULT expression ]
environment-name : 
  C_ESQL32
| C_ESQL64
| C_ODBC32
| C_ODBC64
| CLR
| JAVA
| PERL
| PHP
パラメータ
  • CREATE FUNCTION   外部関数またはネイティブ関数を呼び出す永続的なストアド関数の作成には、さまざまなプログラミング言語を使用できます。

    パラメータ名は、カラム名など他のデータベース識別子に対するルールに従って付けてください。これらは有効な SQL データ型にする必要があります。有効なデータ型のリストについては、SQL データ型を参照してください。

    パラメータには、キーワード IN をプレフィクスとして付けることができます。ただし、関数パラメータはデフォルトで IN です。

    • IN   このパラメータは、ファンクションに値を与える式です。

    関数を実行するときに、すべてのパラメータを指定する必要はありません。CREATE FUNCTION 文の中にデフォルト値がある場合、不明のパラメータにデフォルト値を割り当てます。関数の実行時に、引数が指定されておらず、デフォルトも設定されていない場合には、エラーが発生します。

    OR REPLACE (CREATE OR REPLACE FUNCTION) を指定すると、新しい関数が作成されるか、同じ名前の既存の関数が置き換えられます。この句によって、関数の定義は変更されますが、既存のパーミッションは保持されます。

    EXTERNAL NAME 句は TEMPORARY 関数ではサポートされていませんので、注意してください。

  • [ NOT ] DETERMINISTIC 句   この句は、関数が決定的か非決定的かを示すために使用します。この句が省略されると、関数の決定的な動作は指定されません (デフォルト)。

    DETERMINISTIC と宣言された関数は、同じパラメータ・セットで呼び出されるたび、同じ値を返します。

    NOT DETERMINISTIC と宣言された関数は、同じパラメータ・セットに対して同じ値を返すとはかぎりません。NOT DETERMINISTIC として宣言された関数は、クエリで呼び出されるたびに再評価されます。特定のパラメータ・セットに対して関数が返す結果が変化するとわかっている場合は、この句を使用してください。

    また、基本となるデータの修正などの関連する動作を伴う関数は、NOT DETERMINISTIC として宣言してください。たとえば、プライマリ・キー値を生成し、INSERT ... SELECT 文で使用する関数は、次のように NOT DETERMINISTIC として宣言してください。

    CREATE FUNCTION keygen( increment INTEGER )
    RETURNS INTEGER
    NOT DETERMINISTIC
    BEGIN
      DECLARE keyval INTEGER;
      UPDATE counter SET x = x + increment;
      SELECT counter.x INTO keyval FROM counter;
      RETURN keyval
    END
    INSERT INTO new_table
    SELECT keygen(1), ...
    FROM old_table;

    特定の入力パラメータに対して常に同じ値を返す関数は、DETERMINISTIC として宣言できます。

  • SQL SECURITY 句   SQL SECURITY 句は、INVOKER (関数を呼び出すユーザ) または DEFINER (関数を所有するユーザ) として関数が実行されるかどうかを定義します。デフォルトは DEFINER です。外部呼び出しの場合、この句は、外部環境での修飾されていないオブジェクト参照に対して所有者のコンテキストを確立します。

    SQL SECURITY INVOKER が指定されている場合、関数を呼び出すユーザごとに注釈を行う必要があるため、メモリ使用量が増えます。また、SQL SECURITY INVOKER が指定されている場合は、呼び出し側としても名前の決定が行われます。このため、すべてのオブジェクト名 (テーブル、プロシージャなど) を該当する所有者で修飾する場合は注意が必要です。たとえば、user1 が次の関数を作成するとします。

    CREATE FUNCTION user1.myFunc()
       RETURNS INT
       SQL SECURITY INVOKER
       BEGIN
         DECLARE res INT;
         SELECT COUNT(*) INTO res FROM table1;
         RETURN res;
       END;

    user2 がこの関数を実行しようとし、テーブル user2.table1 が存在しない場合、テーブル・ルックアップ・エラーが生じます。さらに、user2.table1 が存在する場合は、意図する user1.table1 の代わりにこのテーブルが使用されます。このような状況を防ぐには、文においてテーブル参照を修飾します (単なる table1 ではなく、user1.table1 とします)。

  • EXTERNAL NAME native-call 句  

    native-call :
    [operating-system:]function-name@library; ...
    
    operating-system : Unix
    

    LANGUAGE 属性なしで EXTERNAL NAME 句を使用する関数は、C などのプログラミング言語で記述されたネイティブ関数へのインタフェースを定義します。ネイティブ関数は、データベース・サーバによってそのアドレス領域にロードされます。

    library 名にはファイル拡張子を付けることができます。これは通常、Windows では .dll、UNIX では .so です。拡張子がない場合、ライブラリに対するプラットフォーム固有のデフォルトのファイル拡張子が追加されます。次に、正式な例を示します。

    CREATE FUNCTION mystring( IN instr LONG VARCHAR )
    RETURNS LONG VARCHAR
    EXTERNAL NAME 'mystring@mylib.dll;Unix:mystring@mylib.so';
    

    上記の EXTERNAL NAME 句を、プラットフォーム固有のデフォルト値を使用して簡単に記述すると、次のようになります。

    CREATE FUNCTION mystring( IN instr LONG VARCHAR )
    RETURNS LONG VARCHAR
    EXTERNAL NAME 'mystring@mylib';
    

    呼び出されると、関数を含むライブラリがデータベース・サーバのアドレス領域にロードされます。ネイティブ関数は、サーバの一部として実行されます。この場合、関数が原因で障害が発生すると、データベース・サーバは終了されます。したがって、外部環境での関数のロードと実行には、LANGUAGE 属性を使用することをおすすめします。関数が原因で外部環境に障害が発生しても、データベース・サーバは実行し続けます。

    ネイティブ・ライブラリ呼び出しの詳細については、プロシージャからの外部ライブラリの呼び出しを参照してください。

  • EXTERNAL NAME c-call LANGUAGE {C_ESQL32 | C_ESQL64 | C_ODBC32 | C_ODBC64 } 句   コンパイル済みネイティブ C 関数をデータベース・サーバ内でなく外部環境で呼び出すには、ストアド・プロシージャまたは関数を EXTERNAL NAME 句で定義し、後続の LANGUAGE 属性で C_ESQL32、C_ESQL64、C_ODBC32、C_ODBC64 のいずれか 1 つを指定します。

    LANGUAGE 属性が指定されると、その関数を含むライブラリが外部プロセスによってロードされ、外部関数がその外部プロセスの一部として実行されます。この場合、関数が原因で障害が発生しても、データベース・サーバは実行し続けます。

    次に、関数定義の例を示します。

    CREATE FUNCTION ODBCinsert( 
      IN ProductName CHAR(30),
      IN ProductDescription CHAR(50)
    )
    RETURNS INT
    EXTERNAL NAME 'ODBCexternalInsert@extodbc.dll'
    LANGUAGE C_ODBC32;

    詳細については、ESQL 外部環境と ODBC 外部環境を参照してください。

  • EXTERNAL NAME clr-call LANGUAGE CLR 句   .NET 関数を外部環境で呼び出すには、関数インタフェースを EXTERNAL NAME 句で定義し、それに続いて LANGUAGE CLR 属性を指定します。

    CLR ストアド・プロシージャまたは関数の動作は、SQL ストアド・プロシージャまたは関数と同じです。ただし、プロシージャまたは関数のコードは C# または Visual Basic などの .NET 言語で記述され、その実行はデータベース・サーバの外側 (つまり別の .NET 実行ファイル内) で行われます。

    次に、関数定義の例を示します。

    CREATE FUNCTION clr_interface( 
        IN p1 INT, 
        IN p2 UNSIGNED SMALLINT, 
        IN p3 LONG VARCHAR)
    RETURNS INT 
    EXTERNAL NAME 'CLRlib.dll::CLRproc.Run( int, ushort, string )' 
    LANGUAGE CLR;

    詳細については、CLR 外部環境を参照してください。

  • EXTERNAL NAME perl-call LANGUAGE PERL 句   Perl 関数を外部環境で呼び出すには、関数インタフェースを EXTERNAL NAME 句で定義し、それに続いて LANGUAGE PERL 属性を指定します。

    Perl ストアド・プロシージャまたは関数の動作は、SQL ストアド・プロシージャまたは関数と同じです。ただし、プロシージャまたは関数のコードは Perl で記述され、その実行はデータベース・サーバの外側 (つまり Perl 実行インスタンス内) で行われます。

    次に、関数定義の例を示します。

    CREATE FUNCTION PerlWriteToConsole( IN str LONG VARCHAR) 
    RETURNS INT
    EXTERNAL NAME '<file=PerlConsoleExample> 
        WriteToServerConsole( $sa_perl_arg0 )'
    LANGUAGE PERL;

    詳細については、PERL 外部環境を参照してください。

  • EXTERNAL NAME php-call LANGUAGE PHP 句   PHP 関数を外部環境で呼び出すには、関数インタフェースを EXTERNAL NAME 句で定義し、それに続いて LANGUAGE PHP 属性を指定します。

    PHP ストアド・プロシージャまたは関数の動作は、SQL ストアド・プロシージャまたは関数と同じです。ただし、プロシージャまたは関数のコードは PHP で記述され、その実行はデータベース・サーバの外側 (つまり PHP 実行インスタンス内) で行われます。

    次に、関数定義の例を示します。

    CREATE FUNCTION PHPPopulateTable()
    RETURNS INT
    EXTERNAL NAME '<file=ServerSidePHPExample> ServerSidePHPSub()'
    LANGUAGE PHP;

    詳細については、PHP 外部環境を参照してください。

  • EXTERNAL NAME java-call LANGUAGE JAVA 句   Java メソッドを外部環境で呼び出すには、関数インタフェースを EXTERNAL NAME 句で定義し、それに続いて LANGUAGE JAVA 属性を指定します。

    Java とのインタフェースとなるストアド・プロシージャまたは関数の動作は、SQL ストアド・プロシージャまたは関数と同じです。ただし、プロシージャまたは関数のコードは Java で記述され、その実行はデータベース・サーバの外側 (つまり Java 仮想マシン内) で行われます。

    次に、関数定義の例を示します。

    CREATE FUNCTION HelloDemo( IN name LONG VARCHAR ) 
    RETURNS INT
    EXTERNAL NAME 'Hello.main([Ljava/lang/String;)V'
    LANGUAGE JAVA;

    詳細については、Java 外部環境を参照してください。

備考

CREATE FUNCTION 文はデータベースに関数を作成します。DBA 権限があるユーザは、所有者を指定することによって他のユーザの関数を作成できます。関数は、SQL 式の一部として呼び出されます。

複数の関数からテンポラリ・テーブルを参照する場合、テンポラリ・テーブル定義が矛盾していたり、テーブルを参照する文がキャッシュされていたりすると、問題が発生する可能性があります。プロシージャ内でのテンポラリ・テーブルの参照を参照してください。

パーミッション

テンポラリ関数を作成するのでないかぎり、RESOURCE 権限が必要です。

外部関数を作成する場合、および別のユーザの関数を作成する場合、DBA 権限が必要です。

関連する動作

オートコミット。

参照
標準と互換性
  • SQL/2003   永続的ストアド・モジュール機能。Java 結果セットの構文拡張は、オプションの J621 機能に指定されています。