3.10.1 CREATE FUNCTION(関数定義)
(2) 使用権限
- スキーマを所有するユーザ
-
自分が所有する関数を定義できます。
(3) 形式
CREATE 関数本体 関数本体::=FUNCTION 〔認可識別子.〕ルーチン識別子 (〔SQLパラメタ名 データ型 〔,SQLパラメタ名 データ型〕…〕) RETURNS データ型 〔LANGUAGE {SQL|JAVA|C}〕 〔SQLコンパイルオプション〕 {SQL手続き文|外部ルーチン指定} SQLコンパイルオプション::=SUBSTR LENGTH 文字の最大長 外部ルーチン指定::=EXTERNAL NAME {外部Javaルーチン名|外部Cストアドルーチン名} PARAMETER STYLE パラメタスタイル パラメタスタイル::={JAVA|RDSQL }
(4) オペランド
(a) 〔認可識別子.〕ルーチン識別子
- 認可識別子
-
定義する関数の所有者の認可識別子を指定します。
- ルーチン識別子
-
定義する関数のルーチン識別子を指定します。ルーチン識別子は,所有者のルーチン中で同じ識別子を使用できます。
(b) (〔SQLパラメタ名 データ型〔,SQLパラメタ名 データ型〕…〕)
- SQLパラメタ名
-
関数のパラメタの名称を指定します。一つの関数中で,SQLパラメタ名は重複して指定できません。
- データ型
-
関数のパラメタのデータ型を指定します。
BOOLEANは指定できません。
指定するデータ型が抽象データ型で,認可識別子を省略した場合,省略時に仮定される認可識別子に同一名称の抽象データ型がないときは,認可識別子'MASTER'に同一名称の抽象データ型があれば,その抽象データ型を指定したものとします。
次のデータ型は指定できません。
-
LANGUAGE句でJAVA又はCを指定した場合,抽象データ型
-
LANGUAGE句でCを指定した場合,BINARY型及びBLOB型
指定できるデータ型については,「型マッピング」又は「SQLパラメタのデータ型と,C関数に渡すパラメタのデータ型の対応関係」を参照してください。
-
(c) RETURNS データ型
- データ型
-
関数の戻り値のデータ型を指定します。
次のデータ型は指定できません。
-
LANGUAGE句でC以外を指定した場合,BOOLEAN
-
LANGUAGE句でJAVA又はCを指定した場合の抽象データ型
-
LANGUAGE句でCを指定した場合,BINARY型及びBLOB型
指定できるデータ型については,「型マッピング」又は「SQLパラメタのデータ型と,C関数に渡すパラメタのデータ型の対応関係」を参照してください。
指定するデータ型が抽象データ型で,認可識別子を省略した場合,省略時に仮定される認可識別子に同一名称の抽象データ型がないときは,認可識別子'MASTER'に同一名称の抽象データ型があれば,その抽象データ型を指定したものとします。
-
(d) LANGUAGE {SQL|JAVA|C}
定義する関数の記述言語を指定します。
外部ルーチン指定を指定する場合,記述言語はJAVA又はCにしてください。
- SQL
-
関数の処理部分をSQL手続き文にする場合に指定します。
- JAVA
-
関数の処理部分を外部ルーチン指定にする場合で,関数をJavaクラスのメソッドで実装するときに指定します。
- C
-
関数の処理部分を外部ルーチン指定にする場合で,関数をC言語で実装するときに指定します。Cを指定した場合,SQLパラメタの最大数が128に制限されます。
このオペランドの指定によって,他オペランドの指定要否が変わります。LANGUAGE句指定による他オペランドの指定要否を次の表に示します。
他オペランド |
LANGUAGE句 |
||
---|---|---|---|
SQL |
JAVA |
C |
|
EXTERNAL NAME |
× |
○ |
○ |
PARAMETER STYLE |
× |
JAVA |
RDSQL |
SQL手続き文 |
○ |
× |
× |
- (凡例)
-
○:指定してください。
×:指定しないでください。
JAVA:JAVAを指定してください。
RDSQL:RDSQLを指定してください。
(e) SQLコンパイルオプション::=SUBSTR LENGTH 文字の最大長
- 〔SUBSTR LENGTH 文字の最大長〕
-
1文字を表現する最大バイト数を指定します。
文字の最大長に指定できる値は,3〜6(pdntenvコマンド(UNIX版の場合はpdsetupコマンド)で文字コード種別にutf-8_ivsを指定した場合は3〜10)です。
pdntenvコマンド(UNIX版の場合はpdsetupコマンド)で文字コード種別にutf-8,又はutf-8_ivsを指定した場合にだけ有効となり,スカラ関数SUBSTRの結果の長さに影響します。SUBSTRについては,「SUBSTR」を参照してください。
- 《システム定義との関係》
-
SUBSTR LENGTHを省略すると,システム定義のpd_substr_lengthオぺランドの指定値が仮定されます。pd_substr_lengthオペランドについては,マニュアル「HiRDB システム定義」を参照してください。
- 《クライアント環境定義との関係》
-
CREATE FUNCTIONに対して,PDSUBSTRLENの指定は無効となります。PDSUBSTRLENについては,マニュアル「HiRDB UAP開発ガイド」を参照してください。
- 《pdntenvコマンド又はpdsetupコマンドで指定した文字コード種別との関係》
-
文字コード種別にutf-8,又はutf-8_ivsを指定した場合だけ有効となります。
そのほかの文字コード種別の場合は,構文チェックだけ行い,指定を無視します。
(f) SQL手続き文
SQL関数で実行するSQL手続き文を指定します。
SQL手続き文については,「ルーチン制御SQL」の「全般規定」を参照してください。
指定できるのは複合文だけです。また,SQL関数の中で最後に実行するSQL手続き文は,RETURN文でなければなりません。
(g) EXTERNAL NAME {外部Javaルーチン名|外部Cストアドルーチン名}
- 外部Javaルーチン名
-
Java言語で記述したJavaメソッドを外部ルーチンとして指定します。外部Javaルーチン名の指定方法については,「外部Javaルーチン名」を参照してください。
- 外部Cストアドルーチン名
-
C言語で記述したC関数を外部ルーチンとして指定します。外部Cストアドルーチン名の指定方法については,「外部Cストアドルーチン名」を参照してください。
LANGUAGE句でCを指定する場合は,「SQLパラメタのデータ型と,C関数に渡すパラメタのデータ型の対応関係」を参照してください。
(h) PARAMETER STYLE パラメタスタイル
外部ルーチンを呼び出す場合,パラメタとして引き渡される内容を指定します。
- パラメタスタイルがJAVAの場合
-
SQLデータ型で定義している外部Java関数のパラメタは,SQLデータ型に対応したJavaデータ型のJavaメソッドのパラメタとして渡されます。
Javaデータ型で定義しているJavaメソッドの戻り値は,Javaデータ型に対応したSQLデータ型の外部Java関数の戻り値として返されます。
- パラメタスタイルがRDSQLの場合
-
SQLパラメタ数をnとすると,外部C関数のSQLパラメタは,次の表に示すように,C関数のパラメタとして渡されます。
表3‒16 C関数のパラメタとして渡される内容 パラメタ番号
(nはSQL
パラメタ数)
内容
内容の詳細
データ型
1番目〜n番目
SQLパラメタのデータ部
SQLパラメタのデータ部に対応する,入力パラメタです。
SQLパラメタのデータ型に対応するデータ型※1
n+1番目
戻り値のデータ
外部Cストアドルーチンを実装したC関数が,戻り値を設定するための出力パラメタです。
RETURNSで指定したSQLデータ型に対応するデータ型※1
n+2番目〜
2n+1番目
SQLパラメタの標識部
SQLパラメタの標識部に対応する,入力パラメタです。データがナル値の場合,負の値を設定してC関数に渡します。
short*
2n+2番目
戻り値の標識部
外部Cストアドルーチンの戻り値の標識部を設定するための出力パラメタです。初期値として,0が設定されています。
外部Cストアドルーチンを実装したC関数内では,次の説明に従って,標識部を設定してください。
-
出力値がナル値の場合
設定値:−1
-
出力値が非ナル値の場合
設定値:0
short*
2n+3番目
SQLSTATE
外部Cストアドルーチンを実装したC関数が,SQLSTATEの値を設定するための出力パラメタです。領域長は6バイトです。領域の先頭から5バイト目までにSQLSTATEの値を設定してください。外部Cストアドルーチンを実装したC関数内では,次の説明に従って,SQLSTATEの値を設定してください。
-
C関数が正常終了したとき
設定値:‘00000’
SQL実行結果:正常終了します。
-
C関数が異常終了したとき
設定値:形式’38XYY’の値
X,Yは,それぞれ次の範囲の値です。
X:’I’〜’Z’
Y:’0’〜’9’又は’A’〜’Z’
(例)’38I01’,’38ZCD’
SQL実行結果:SQLエラーになります。
-
C関数が任意の状態で終了したとき
設定値:‘00000’,形式’38XYY’の値以外
SQL実行結果:SQLエラーになります。
char*
2n+4番目
ルーチン名
ルーチン名を表す入力パラメタです。
struct{
short 変数名1;
char変数名2[30];
}*※2
2n+5番目
特定名
関数を特定するための特定名を表す入力パラメタです。
struct{
short 変数名1;
char変数名2[30];
}*※2
2n+6番目
メッセージテキスト
外部Cストアドルーチンを実装したC関数内でエラーが発生した場合,エラーが発生した詳細な理由を設定するための出力パラメタです。
外部Cストアドルーチンの実行終了時,SQLSTATEにクラス38の値が設定されていると,メッセージテキストを埋め込んだエラーメッセージが出力されます。
なお,設定できるメッセージテキストの長さは,最大80バイトです。
struct{
short 変数名1;
char変数名2[80];
}*※2
-
- 注※1
-
外部C関数定義時に指定できるSQLパラメタのデータ型と,外部Cストアドルーチンを実装したC関数に渡すパラメタのデータ型の対応関係については,「SQLパラメタのデータ型と,C関数に渡すパラメタのデータ型の対応関係」を参照してください。
- 注※2
-
変数名1に文字列長(バイト数),変数名2に内容を表す文字列を設定します。
表3‒17 SQLパラメタのデータ型と,C関数に渡すパラメタのデータ型の対応関係 SQLパラメタの
データ型
C関数に渡すパラメタのデータ型
領域サイズ(byte)
備考
INT〔EGER〕
int*
4
−
SMALLINT
short*
2
−
〔LARGE〕 DEC〔IMAL〕〔(p〔,s〕)〕,
〔LARGE〕NUMERIC〔(p〔,s〕)〕
char* ※2
↓p/2↓ + 1
1≦p≦38,0≦s≦p
FLOAT,
DOUBLE PRECISION
double*
8
−
SMALLFLT,
REAL
float*
4
−
CHAR〔ACTER〕〔(n)〕
char* ※1
n + 1
1≦n≦30,000
CHAR〔ACTER〕〔(n)〕 CHARACTER SET〔MASTER.〕EBCDIK
CHAR〔ACTER〕〔(n)〕CHARACTER SET 〔MASTER.〕UTF16
char* ※1
n + 2
2≦n≦30,000
VARCHAR(n)
char* ※1
n + 1
1≦n≦32,000
VARCHAR(n) CHARACTER SET 〔MASTER.〕EBCDIK
CHAR〔ACTER〕 VARYING(n)
char* ※1
n + 1
1≦n≦32,000
CHAR〔ACTER〕 VARYING(n) CHARACTER SET 〔MASTER.〕EBCDIK
VARCHAR(n) CHARACTER SET〔MASTER.〕 UTF16
char* ※1
n + 2
2≦n≦32,000
CHAR〔ACTER〕 VARYING(n) CHARACTER SET〔MASTER.〕 UTF16
char* ※1
n + 2
2≦n≦32,000
NCHAR〔(n)〕,
NATIONAL CHAR〔ACTER〕〔(n)〕
char* ※1
2n + 1
1≦n≦15,000
NVARCHAR(n),
NATIONAL CHAR〔ACTER〕 VARYING(n),
NCHAR VARYING(n)
char* ※1
2n + 1
1≦n≦16,000
MCHAR〔(n)〕
char* ※1
n + 1
1≦n≦30,000
MVARCHAR(n)
char* ※1
n + 1
1≦n≦32,000
DATE
char*※4
4
−
TIME
char*※4
3
−
INTERVAL YEAR TO DAY
char* ※3
5
−
INTERVAL HOUR TO SECOND
char* ※3
4
−
TIMESTAMP〔(p)〕
char* ※4
n
領域サイズnは,pの値に従って,次のように決定します。
-
p=0のとき,n=7
-
p=2のとき,n=8
-
p=4のとき,n=9
-
p=6のとき,n=10
BOOLEAN
int* ※5
4
0:偽
1:真
標識変数
short*
2
−
-
- 注※1
-
文字集合指定UTF16が指定されていないSQLのデータ型(CHAR(n),VARCHAR(n),NCHAR(n),NVARCHAR(n),MCHAR(n),MVARCHAR(n))と,C言語のデータ型(char[n+1],char[n+1],char[2n+1],char[2n+1],char[n+1],char[n+1])との間での変換規則を示します。
- SQLのデータ型からC言語のデータ型への変換(Cストアドプロシジャの場合は,入力パラメタ及び入出力パラメタ,Cストアドファンクションの場合は,入力パラメタ)
-
-
CHAR(n)からchar[n+1]への変換
-
VARCHAR(n)からchar[n+1]への変換
-
NCHAR(n)からchar[2n+1]への変換
-
NVARCHAR(n)からchar[2n+1]への変換
-
MCHAR(n)からchar[n+1]への変換
-
MVARCHAR(n)からchar[n+1]への変換
文字列の終端にナル文字を付け加えます。
-
- C言語のデータ型からSQLのデータ型への変換(Cストアドプロシジャの場合は,出力パラメタ及び入出力パラメタ,Cストアドファンクションの場合は,戻り値)
-
-
char[n+1]からCHAR(n)への変換
-
char[n+1]からVARCHAR(n)への変換
-
char[2n+1]からNCHAR(n)への変換
-
char[2n+1]からNVARCHAR(n)への変換
-
char[n+1]からMCHAR(n)への変換
-
char[n+1]からMVARCHAR(n)への変換
C言語の文字列からHiRDBが受け取る文字列の長さは,先頭からナル文字の一つ前までの長さとします。SQLのデータ型がCHAR(n),NCHAR(n)又はMCHAR(n)であり,HiRDBが受け取った文字列の長さがSQLのデータ型の定義長に満たない場合は,文字列の終わりに空白を追加して定義長にします。なお,n+1個の配列要素の中にナル文字がない場合,異常終了します。
-
文字集合指定UTF16が指定されているSQLのデータ型(CHAR(n),VARCHAR(n))と,C言語のデータ型(char[n+2],char[n+2])との間での変換規則を示します。
- SQLのデータ型からC言語のデータ型への変換(Cストアドプロシジャの場合は,入力パラメタ及び入出力パラメタ,Cストアドファンクションの場合は,入力パラメタ)
-
-
CHAR(n)からchar[n+2]への変換
-
VARCHAR(n)からchar[n+2]への変換
文字列の終端に2バイトのナル文字を付け加えます。
-
- C言語のデータ型からSQLのデータ型への変換(Cストアドプロシジャの場合は,出力パラメタ及び入出力パラメタ,Cストアドファンクションの場合は,戻り値)
-
-
char[n+2]からCHAR(n)への変換
-
char[n+2]からVARCHAR(n)への変換
C言語の文字列からHiRDBが受け取る文字列の長さは,先頭からナル文字の一つ前までの長さとします。SQLのデータ型がCHAR(n)であり,HiRDBが受け取った文字列の長さがSQLのデータ型の定義長に満たない場合は,文字列の終わりに空白を追加して定義長にします。なお,n+2個の配列要素の中に2バイトのナル文字がない場合,異常終了します。
-
- 注※2
-
DECIMAL型は,パック10進形式でデータを表現します。DECIMAL型については,「データ型」を参照してください。
C言語によってDECIMAL型の値を設定する記述例を次に示します。
-
123.4567(奇数けた)の場合
unsigned char ex1[4]={0x12,0x34,0x56,0x7c};
-
-123.456(偶数けた)の場合
unsigned char ex2[4]={0x01,0x23,0x45,0x6d};
-
0(奇数けた)の場合
unsigned char ex3[1]={0x0c};
-
- 注※3
-
INTERVAL YEAR TO DAY型,INTERVAL HOUR TO SECOND型は,パック10進形式でデータを表現します。各データ型については,「データ型」を参照してください。
- 注※4
-
DATE型,TIME型,TIMESTAMP型は,符号なしパック10進形式でデータを表現します。各データ型については,「データ型」を参照してください。
- 注※5
-
BOOLEAN型は,Cストアドファンクションの戻り値としてだけ使用できます。
(5) 共通規則
-
SQLパラメタは,代入文の代入先には指定できません。
-
関数のパラメタは,30,000個(LANGUAGE句がCの場合は128個)以下でなければなりません。ただし,LANGUAGE句にSQL以外を指定した場合,30,000個以下でも,外部ルーチンの言語仕様の制限で実行時にエラーになるときがあります。
-
SQLパラメタは,入力用のSQLパラメタとなります。
-
SQL手続き文中で指定する関数は,既に定義してある関数だけ指定できます。
-
関数を定義すると,システムが各関数を一意に特定するための特定名を定義します。特定名の名称規則を次に示します。
特定名::=F 関数名 オブジェクトID
-
先頭1バイト'F'固定
-
2バイト目から関数名(関数名が19バイトを超える場合は,19文字まで使用します)
-
関数名に続いてオブジェクトIDが10バイト(右詰めで先頭から0が埋め込まれた値となります)
-
-
システムが提供する関数と同じ関数は定義できません。次に示す条件1又は条件2のどちらかの条件をすべて満たす場合,その関数は定義できません。
条件1
-
関数のSQLパラメタ数が二つ
-
1番目のSQLパラメタのデータ型が抽象データ型
-
関数名と同じ名称の属性が,1番目のSQLパラメタで指定した抽象データ型中の属性として定義されている
-
2番目のSQLパラメタのデータ型が,関数名と同じ名称の属性のデータ型と同じ
条件2
-
関数のSQLパラメタ数が一つ
-
SQLパラメタのデータ型が抽象データ型
-
関数名と同じ名称の属性が,SQLパラメタで指定した抽象データ型中の属性として定義されている
-
-
LANGUAGE句を省略,又はLANGUAGE句にSQLを指定した場合,外部ルーチン指定は指定できません。
-
LANGUAGE句にSQL以外を指定した場合,SQL手続き文は指定できません。
-
関数本体中に指定した関数呼出しの関数名が認可識別子で修飾されている場合,現在定義しようとしている関数と,認可識別子,ルーチン識別子,引数の数が一致する関数は指定できません。
関数本体中に指定した関数呼出しの関数名が認可識別子で修飾されていない場合,現在定義しようとしている関数と,ルーチン識別子,引数の数が一致する関数は指定できません。
-
次の条件をすべて満たす関数が定義されている場合,CREATE FUNCTIONは実行できません。
-
認可識別子が同じ
-
ルーチン識別子(関数名)が同じ
-
パラメタの数が同じ
-
パラメタのデータ型が同じ※
- 注※
-
固定長文字データ型又は可変長文字データ型の文字集合指定が異なる場合は,異なるデータ型として扱います。
-
-
ALTER ROUTINEでSQLコンパイルオプションを指定する場合,再作成する関数の元のCREATE FUNCTIONにSQLコンパイルオプションを反映してできるSQL文は,SQL文の最大長を超えないようにしてください。
-
実行中のSQLオブジェクトが無効になる場合,外部Java手続き中からCREATE FUNCTIONは実行できません。
(6) 留意事項
-
CREATE FUNCTIONは,OLTP下のX/Openに従ったUAPから指定できません。
-
SQLパラメタは,ナル値を持てます。
-
SQL手続き文中で複数のSQL文を実行するためには,複合文などのルーチン制御SQLを使用します。
-
SQL関数を定義すると,それを実行するためのアクセス手順を記述したSQLオブジェクトが作成されます。
-
関数定義に伴うSQLオブジェクトの無効化について示します。
-
定義する関数と,所有者,ルーチン識別子,及びSQLパラメタ数が同じ関数が既にある場合,既にある関数を使用する関数,手続き,及びトリガの有効なSQLオブジェクトがあれば,そのSQLオブジェクトは無効となります。
-
定義する関数と,ルーチン識別子及びSQLパラメタ数が同じで,かつ認可識別子が'MASTER'の関数がある場合,認可識別子'MASTER'の関数を使用する関数,手続き,及びトリガの有効なSQLオブジェクトのうち,定義する関数の認可識別子が所有するSQLオブジェクトは無効となります。また,有効なSQLオブジェクトがパブリック関数及びパブリック手続きの場合,定義する関数の認可識別子と,パブリック関数及びパブリック手続きを定義した認可識別子が同じならば,そのパブリック関数及びパブリック手続きのSQLオブジェクトは無効となります。
-
定義する関数と,ルーチン識別子及びSQLパラメタ数が同じパブリック関数がある場合,そのパブリック関数を使用する関数,手続き,及びトリガの有効なSQLオブジェクトのうち,定義する関数の認可識別子が所有するSQLオブジェクトは無効となります。また,有効なSQLオブジェクトがパブリック関数及びパブリック手続きの場合,定義する関数の認可識別子と,パブリック関数及びパブリック手続きを定義した認可識別子とが同じならば,そのパブリック関数及びパブリック手続きのSQLオブジェクトは無効となります。
ストアドファンクションを定義,又は削除するときの注意事項については,マニュアル「HiRDB UAP開発ガイド」を参照してください。
-
-
5に示した無効になる関数のうち,次のどちらかの条件を満たす関数をビュー定義で使用している場合,関数定義がエラーになります。
-
引数のデータ型に抽象データ型を使用している
-
戻り値のデータ型に抽象データ型を使用している
-
-
関数,手続き,及びトリガの有効なSQLオブジェクトが無効になった場合,ディクショナリ表SQL_ROUTINE_RESOURCES中の無効となった関数,手続き,及びトリガの行は削除されます。
-
無効となった関数,手続き,及びトリガのSQLオブジェクトを実行するためには,ALTER ROUTINE,ALTER PROCEDURE,又はALTER TRIGGERを実行して,関数,手続き,及びトリガのSQLオブジェクトを再作成しておく必要があります。
-
関数定義に伴って無効となった関数を使用したビュー表がある場合,そのビュー表を操作するにはALTER ROUTINEを実行して関数のSQLオブジェクトを再作成しておく必要があります。
-
ルーチン内でのルーチンの呼び出しを多数又は無限に繰り返す場合,OSのスタックがオーバフローすることがあります。
-
SQLコンパイルオプションのSUBSTR LENGTHは,関数の定義時,又は変更時の指定で決まり,関数呼出し時のシステム定義やクライアント環境定義の影響を受けません。