ストアド・プロシージャまたはストアド関数の宣言済みパラメータは、そのプロシージャまたは関数が実行されるたびに、ストアド関数またはストアド・プロシージャ定義内のプレースホルダを自動的に置き換えます。感嘆符 (!) の後に宣言されたパラメータの 1 つの名前が続いている部分文字列はすべて、パラメータの値で置換されます。
たとえば、次のプロシージャ定義では、URL 全体がパラメータとして渡されます。このプロシージャが呼び出されるたびに、異なる値を使用できます。
CREATE PROCEDURE test ( url CHAR(128) ) URL '!url' TYPE 'HTTP:POST'; |
たとえば、次のようなプロシージャを使用できます。
CALL test ( 'HTTP://localhost/myservice' ); |
代入パラメータの有効な適用例として、ユーザ名やパスワードなどの機密の値を Web サービス・クライアント関数やプロシージャの定義の一部にすることを避けることがあります。そのような値がプロシージャまたは関数定義でリテラルとして指定されていると、それらはシステム・テーブルに保存され、データベースのすべてのユーザによって簡単にアクセスされてしまいます。このような値をパラメータとして渡すと、この問題を回避できます。
たとえば、次のプロシージャ定義には、ユーザ名とパスワードがプロシージャ定義の一部としてプレーン・テキストで含まれています。
CREATE PROCEDURE test () URL 'HTTP://dba:sql@localhost/myservice'; |
ユーザとパスワードをパラメータとして宣言するとこの問題を避けることができます。これにより、ユーザとパスワードの値はプロシージャが呼び出されたときにしか提供されなくなります。次に例を示します。
CREATE PROCEDURE test ( uid CHAR(128), pwd CHAR(128) ) URL 'HTTP://!uid:!pwd@localhost/myservice'; |
このプロシージャは次のように呼び出されます。
CALL test ( 'dba', 'sql' ); |
別の例として、代入パラメータを使用してファイルからストアド・プロシージャまたはストアド関数に暗号化証明書を渡すことができます。
CREATE PROCEDURE secure( cert LONG VARCHAR ) URL 'https://localhost/secure' TYPE 'HTTP:GET' CERTIFICATE 'cert=!cert;company=test;unit=test;name=RSA Server'; |
このプロシージャを呼び出すときに証明書を文字列として提供します。次の呼び出し例では、証明書をファイルから読み出します。証明書は、CERTIFICATE 句の file= キーワードを使用して、ファイルから直接読み出すことができるため、これは説明のためにのみ行います。
CALL secure( xp_read_file('install-dir\bin32\rsaserver.id') ); |
感嘆符 (!) は Web サービス・クライアントのストアド関数とストアド・プロシージャのコンテキストで、代入パラメータで使用するプレースホルダを識別するために使用するため、プロシージャの属性文字列の一部としてこの文字を含める場合は、エスケープします。そのためには、感嘆符にプレフィクスとしてもう 1 つの感嘆符を付けます。これにより、Web サービス・クライアントまたは Web サービス関数定義の文字列に含まれるすべての !! が、! で置換されます。
プレースホルダとして使用されたパラメータ名には、アルファベット文字のみを含めます。さらに、あいまいにならないように、プレースホルダの後にはアルファベット以外の文字を挿入します。一致するパラメータ名のないプレースホルダは、自動的に削除されます。たとえば、次のプロシージャでは、パラメータ size はプレースホルダを置換しません。
CREATE PROCEDURE orderitem ( size CHAR(18) ) URL 'HTTP://salesserver/order?size=!sizeXL' TYPE 'SOAP:RPC'; |
!sizeXL は、一致するパラメータのない有効なプレースホルダであるため、常に削除されます。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |