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 PROCEDURE 文 [外部プロシージャ]

この文は、ネイティブ・プロシージャまたは外部プロシージャへのインタフェースを作成するために使用します。SQL プロシージャの作成方法については、CREATE PROCEDURE 文を参照してください。

構文
CREATE [ OR REPLACE ] PROCEDURE [ owner.]procedure-name 
     ( [ parameter, ... ] )
[ RESULT ( result-column, ... ) | NO RESULT SET ]
[ DYNAMIC RESULT SETS integer-expression ]
[ SQL SECURITY { INVOKER | DEFINER } ]
EXTERNAL NAME 'external-call' [ LANGUAGE environment-name  ] 
parameter :
  [ parameter-mode ] parameter-name data-type [ DEFAULT expression ]
| SQLCODE
| SQLSTATE
parameter-mode : IN 
| OUT 
| INOUT
result-column : column-name data-type
environment-name : 
  C_ESQL32
| C_ESQL64
| C_ODBC32
| C_ODBC64
| CLR
| JAVA
| PERL
| PHP
パラメータ
  • CREATE PROCEDURE   外部プロシージャまたはネイティブ・プロシージャを呼び出す永続的なストアド・プロシージャの作成には、さまざまなプログラミング言語を使用できます。PROC は PROCEDURE の同義語として使用できます。

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

    パラメータには、IN、OUT、INOUT のいずれかのキーワードをプレフィクスとして付けることができます。これらの値のいずれも指定しない場合、パラメータはデフォルトで INOUT になります。キーワードには次の意味があります。

    • IN   このパラメータは、プロシージャに値を与える式です。

    • OUT   このパラメータは、プロシージャから値を受け取ることがある変数です。

    • INOUT   このパラメータはプロシージャに値を与え、プロシージャから新しい値を受け取ることがある変数です。

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

    SQLSTATE と SQLCODE は、プロシージャが終了するときに、SQLSTATE または SQLCODE 値を出力する、特別な OUT パラメータです。SQLSTATE と SQLCODE の特別値は、プロシージャのリターン・ステータスのテストを目的として、プロシージャ呼び出しの直後にチェックできます。

    SQLSTATE と SQLCODE 特別値は、その次の SQL 文によって修正されます。SQLSTATE と SQLCODE をプロシージャ引数として与えると、リターン・コードは変数の中に格納されます。

    OR REPLACE (CREATE OR REPLACE PROCEDURE) を指定すると、新しいプロシージャが作成されるか、同じ名前の既存のプロシージャが置き換えられます。この句によって、プロシージャの定義は変更されますが、既存のパーミッションは保持されます。使用中のプロシージャを置き換えようとすると、エラーが返されます。

    TEMPORARY 外部呼び出しプロシージャは作成できません。

  • RESULT 句   RESULT 句は結果セットのカラムの数と型を宣言します。RESULT キーワードに続くカッコで囲まれたリストは、結果カラムの名前と型を定義します。この情報は、CALL 文が記述されている場合に、Embedded SQL DESCRIBE または ODBC SQLDescribeCol によって返されます。データ型のリストについては、SQL データ型を参照してください。

    Embedded SQL (LANGUAGE C_ESQL32、LANGUAGE C_ESQL64) 外部関数または ODBC (LANGUAGE C_ODBC32、LANGUAGE C_ODBC64) 外部関数を呼び出すプロシージャは、結果セットを返さないか、1 つの結果セットを返すことができます。

    Perl または PHP (LANGUAGE PERL、LANGUAGE PHP) 外部関数を呼び出すプロシージャは、結果セットを返すことができません。データベース・サーバによってロードされるネイティブ関数を呼び出すプロシージャは、結果セットを返すことができません。

    CLR または Java (LANGUAGE CLR、LANGUAGE JAVA) 外部関数を呼び出すプロシージャは、結果セットを返さないか、1 つ以上の結果セットを返すことができます。

    プロシージャは、その実行方法に応じて、それぞれカラム数が異なる複数の結果セットを生成する場合があります。たとえば次のプロシージャは、2 カラムを返す場合も、1 カラムを返す場合もあります。

    CREATE PROCEDURE names( IN formal char(1))
    BEGIN
       IF formal = 'n' THEN
          SELECT GivenName
          FROM Employees
       ELSE
          SELECT Surname, GivenName
          FROM Employees
       END IF
    END;

    これらの結果セット・プロシージャは RESULT 句を指定しないで記述するか、Transact-SQL で記述します。これらの使用には、次の制約があります。

    • Embedded SQL   正しい形式の結果セットを取得するには、結果セットのカーソルが開かれてからローが返されるまでの間に、プロシージャ・コールを記述 (DESCRIBE) します。DESCRIBE 文の CURSOR cursor-name 句は必須です。

    • ODBC、OLE DB、ADO.NET   変数結果セット・プロシージャは、これらのインタフェースを使用するアプリケーションで使用できます。結果セットの記述は、ドライバまたはプロバイダによって実行されます。

    • Open Client アプリケーション   変数結果セット・プロシージャは Open Client アプリケーションで使用できます。

    プロシージャが結果セットを 1 つしか返さない場合、RESULT 句を使用してください。この句を使用すると、カーソルがオープンした後で ODBC と Open Client のアプリケーションが結果セットを記述し直すのを防ぐことができます。

    複数の結果セットを処理するために ODBC は、プロシージャが定義した結果セットではなく、現在実行中のカーソルを記述します。したがって、ODBC はいつもプロシージャ定義の RESULT 句内で定義されているカラム名を記述するわけではありません。この問題を回避するには、結果セットを生成する SELECT 文でカラム・エイリアスを使用します。

    プロシージャから返される結果セットの詳細については、プロシージャから返される結果を参照してください。

  • NO RESULT SET 句   このプロシージャによって結果セットが返されないことを宣言します。この宣言によって、パフォーマンスが向上することがあります。

  • DYNAMIC RESULT SETS 句   この句は、LANGUAGE CLR 呼び出しまたは LANGUAGE JAVA 呼び出しで使用します。DYNAMIC RESULT SETS 句を指定しない場合、メソッドは結果セットを返さないと見なされます。

    Perl または PHP (LANGUAGE PERL、LANGUAGE PHP) 外部関数を呼び出すプロシージャは、結果セットを返すことができません。データベース・サーバによってロードされるネイティブ関数を呼び出すプロシージャも、結果セットを返すことができません。

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

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

    CREATE PROCEDURE user1.myProcedure()
       RESULT( columnA INT )
       SQL SECURITY INVOKER
       BEGIN
         SELECT columnA FROM table1;
       END;

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

  • EXTERNAL NAME 'native-call' 句  

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

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

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

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

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

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

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

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

  • EXTERNAL NAME 'c-call' LANGUAGE {C_ESQL32 | C_ESQL64 | C_ODBC32 | C_ODBC64 } 句  

    EXTERNAL NAME 'c-call' LANGUAGE C_ESQL32
    EXTERNAL NAME 'c-call' LANGUAGE C_ESQL64
    EXTERNAL NAME 'c-call' LANGUAGE C_ODBC32
    EXTERNAL NAME 'c-call' LANGUAGE C_ODBC64
    c-call :
    [operating-system:]function-name@library; ...
    
    operating-system : Unix
    

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

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

    次に、プロシージャ定義の例を示します。

    CREATE PROCEDURE ODBCinsert( 
      IN ProductName CHAR(30),
      IN ProductDescription CHAR(50)
    )
    NO RESULT SET
    EXTERNAL NAME 'ODBCexternalInsert@extodbc.dll'
    LANGUAGE C_ODBC32;

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

  • EXTERNAL NAME clr-call LANGUAGE CLR 句  

    EXTERNAL NAME 'clr-call' LANGUAGE CLR
    clr-call :
    dll-name::function-name( param-type-1, ... )
    

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

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

    次に、プロシージャ定義の例を示します。

    CREATE PROCEDURE clr_interface( 
        IN p1 INT, 
        IN p2 UNSIGNED SMALLINT, 
        OUT p3 LONG VARCHAR) 
    NO RESULT SET
    EXTERNAL NAME 'CLRlib.dll::CLRproc.Run( int, ushort, out string )' 
    LANGUAGE CLR;

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

  • EXTERNAL NAME perl-call LANGUAGE PERL 句  

    EXTERNAL NAME 'perl-call' LANGUAGE PERL
    perl-call :
    <file=perl-file> $sa_perl_return = perl-sub( $sa_perl_arg0, ... ) 
    

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

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

    次に、プロシージャ定義の例を示します。

    CREATE PROCEDURE PerlWriteToConsole( IN str LONG VARCHAR) 
    NO RESULT SET
    EXTERNAL NAME '<file=PerlConsoleExample> 
        WriteToServerConsole( $sa_perl_arg0 )'
    LANGUAGE PERL;

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

  • EXTERNAL NAME php-call LANGUAGE PHP 句  

    EXTERNAL NAME 'php-call' LANGUAGE PHP
    php-call :
    <file=php-file> print php-func( $argv[1], ... ) 
    

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

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

    次に、プロシージャ定義の例を示します。

    CREATE PROCEDURE PHPPopulateTable() 
    NO RESULT SET
    EXTERNAL NAME '<file=ServerSidePHPExample> ServerSidePHPSub()'
    LANGUAGE PHP;

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

  • EXTERNAL NAME java-call LANGUAGE JAVA 句  

    EXTERNAL NAME 'java-call' LANGUAGE JAVA
    java-call :
    [package-name.]class-name.method-name method-signature
    
    method-signature : 
    ( [ field-descriptor, ... ] ) return-descriptor
    
    field-descriptor and return-descriptor :
    Z 
    | B 
    | S 
    | I 
    | J 
    | F 
    | D 
    | C 
    | V 
    | [descriptor 
    | Lclass-name;
    

    Java メソッドを外部環境で呼び出すには、プロシージャ・インタフェースを EXTERNAL NAME 句で定義し、それに続いて LANGUAGE JAVA 属性を指定します。

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

    次に、プロシージャ定義の例を示します。

    CREATE PROCEDURE HelloDemo( IN name LONG VARCHAR ) 
    NO RESULT SET
    EXTERNAL NAME 'Hello.main([Ljava/lang/String;)V'
    LANGUAGE JAVA;

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

備考

CREATE PROCEDURE 文はデータベースにプロシージャを作成します。DBA 権限があるユーザは、所有者を指定することによって他のユーザのプロシージャを作成できます。プロシージャは CALL 文で呼び出します。

ストアド・プロシージャが結果セットを返す場合、出力パラメータを設定したり戻り値を返したりすることはできません。

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

パーミッション

テンポラリ・プロシージャを作成するのでないかぎり、RESOURCE 権限が必要です。

外部プロシージャを作成する場合、および別のユーザのプロシージャを作成する場合、DBA 権限が必要です。

関連する動作

オートコミット。

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