17.4.6 STORE文
- 〈この項の構成〉
(1) 機能
レコード実現値を格納します。
(2) 形式
(a) UAPに記述するSTORE文
STORE レコード名 FROM :埋込み変数
(b) DMLコマンドで記述するSTORE文
STORE レコード名 SET 構成要素名=格納値〔,構成要素名=格納値〕…
(3) オペランドの説明
- ●レコード名
-
〜<識別子>((1〜30バイト))
レコード実現値を格納するレコード名を指定します。
- 注意事項
-
-
レコード名に英小文字を使用している場合は,レコード名を引用符(")で囲んでください。引用符で囲まないと,英小文字は英大文字と見なされます。
-
レコード名に空白またはハイフン(-)を使用している場合は,レコード名を引用符(")で囲んでください。
-
- ●FROM :埋込み変数
-
格納対象のレコードの格納値を指定します。
埋込み変数の宣言方法については,マニュアル「HiRDB 構造型データベース機能(UAP開発編)」の「UAPの作成」の「埋込み変数の宣言」を参照してください。
- ●SET 構成要素名=格納値〔,構成要素名=格納値〕…
-
構成要素名:〜<識別子>((1〜30バイト))
格納するレコードの値を指定します。
指定規則を次に示します。
-
最下位レベルの構成要素(基本項目)に対する格納値を指定してください。
-
構成要素名は,レコードの定義で指定した順に指定してください。
-
指定が必要な構成要素をすべて指定してください。
・ルートレコードの場合は基本項目をすべて指定してください。
・子レコードの場合はデータ種別1がUの基本項目をすべて指定してください。
-
指定が必要な構成要素については,#USAGEコマンドの実行結果で確認できます。#USAGEコマンドの実行結果に表示されたひな形のSETオペランドに出力されている構成要素を,出力されている順にすべて指定してください。#USAGEコマンドについては,「14.8.3 #USAGE(DMLコマンドのひな形の出力)」を参照してください。
-
構成要素名に英小文字を使用している場合は,構成要素名を引用符(")で囲んでください。引用符で囲まないと,英小文字は英大文字と見なされます。
-
OCCURS句を指定して生成された構成要素名を使用する場合は引用符(")で囲んでください。OCCURS句については,「11.7.1(4)(g) OCCURS」を参照してください。
-
格納値の指定形式については,「17.2.2 DMLのデータ型」を参照してください。
-
(4) 共通規則
-
子レコードにレコードを格納する場合,次のどれかのDMLで,格納レコードの親レコードまでの位置づけをしておく必要があります。
-
格納レコードの親レコードに対するFIND文
-
格納レコードの親レコードに対するFETCH文
-
格納レコードの親レコードに対するSTORE文
-
-
埋込み変数を指定して,子レコードにレコードを格納する場合,埋込み変数に設定した値のうち,親レコードから引き継いだ構成要素に対応する値は無視されます。この場合,位置づいている親レコードと同じ値が格納されます。
-
埋込み変数を指定して,子レコードにレコードを格納する場合,埋込み変数に設定した値に対応する親レコードの子レコードとして格納されるのではなく,位置づいている親レコードの子レコードとして格納されます。
-
横分割しているレコードに二次インデクスが定義されている場合,レコードが格納されるRDエリアと,二次インデクスが格納されるRDエリアが対応しているかどうかをSTORE文の実行時にチェックします。具体的には,レコードと二次インデクスの格納先が定義上の何番目のRDエリアなのかを求めて,レコードと二次インデクスが定義上の同じ位置に格納されることをチェックします。
なお,子レコードに定義した二次インデクスのRDエリア分割キーにキー(SDBデータベース定義のTYPE句のデータ種別1にKを指定した構成要素)を指定した場合,レコードが格納されるRDエリアと,二次インデクスが格納されるRDエリアが対応しているかどうかのチェックは,ルートレコードの格納時に行われます。
■レコードと二次インデクスが格納されるRDエリアの対応をチェックする例
<スキーマ定義>
RECORD RECA ...1 2 KEY1 3 KEYDATA1 CHARACTER 4 TYPE K,A ...2 3 KEYDATA2 CHARACTER 2 TYPE K,L 2 UDA01 CHARACTER 2 TYPE U,D RECORD RECB ...3 2 KEYDATA1 CHARACTER 4 TYPE K,A 2 KEYDATA2 CHARACTER 2 TYPE K,L 2 UDB01 CHARACTER 2 TYPE U,D 2 UDB02 CHARACTER 2 TYPE U,D
[説明]
-
ルートレコードの定義です。
-
レコード型のRDエリア分割キーの定義です。
-
子レコードの定義です。
<格納スキーマ定義>
STORAGE RECORD RECA SEQUENTIAL IDX1 USED FOR RECORD ...1 DEPENDING ON KEYDATA1 ...2 WITHIN ((RDAREAD01) '0100',(RDAREAD02) '0200', (RDAREAD03)) STORAGE RECORD RECB CLUSTERD SET_AB WITHIN ((RDAREAD01),(RDAREAD02),(RDAREAD03)) SECONDARY INDEX IDX2 USED FOR RECORD ORDER KEY ASCENDING KEYDATA2 DEPENDING ON KEYDATA2 ...3 WITHIN((RDAREAI01) 'BB',(RDAREAI02) 'CC', (RDAREAI03)) SECONDARY INDEX IDX3 USED FOR RECORD ORDER KEY ASCENDING UDB02 DEPENDING ON UDB02 ....4 WITHIN((RDAREAI01) 'XX',(RDAREAI02) 'YY', (RDAREAI03))
[説明]
-
シーケンシャルインデクスは省略します。
-
ルートレコードの分割を定義します。
-
二次インデクスの分割を定義します。
二次インデクスのRDエリア分割キーにTYPE K,Lの構成要素を指定します。
-
二次インデクスの分割を定義します。
二次インデクスのRDエリア分割キーにTYPE U,Dの構成要素を指定します。
上記の定義によって,次のように3つの範囲に分割されます。
最初の範囲: (KEYDATA1,KEYDATA2,UDB02)=( 〜'0100', 〜'BB', 〜'XX') 2番目の範囲:(KEYDATA1,KEYDATA2,UDB02)=('0101'〜'0200','BC'〜'CC','XY'〜'YY') 最後の範囲: (KEYDATA1,KEYDATA2,UDB02)=('0201'〜 ,'CD'〜 ,'YZ'〜 )
- <ルートレコードの格納時に子レコードの二次インデクスをチェックする例>
-
二次インデクスのRDエリア分割キーにキーを指定している二次インデクス(IDX2)について,格納されるRDエリアの対応をチェックする例です。
(例1)
STORE RECA SET KEYDATA1='0090',KEYDATA2='AA',UDA01='00'
- [説明]
-
レコードが格納されるRDエリアは,'0090'が「最初の範囲」に該当するため,RDAREAD01(定義上の1番目のRDエリア)となります。二次インデクス(IDX2)が格納されるRDエリアは,'AA'が「最初の範囲」に該当するため,RDAREAI01(定義上の1番目のRDエリア)となります。二次インデクス(IDX2)が格納されるRDエリアは,RECBのKEYDATA2に対応するRECAのKEYDATA2の値によって取得されます。
レコードが格納されるRDエリアと,二次インデクスが格納されるRDエリアの両方とも定義上1番目のRDエリアとなり対応しているため,STORE文は正常終了します。
(例2)
STORE RECA SET KEYDATA1='0090',KEYDATA2='BC',UDA01='00'
- [説明]
-
レコードが格納されるRDエリアは,'0090'が「最初の範囲」に該当するため,RDAREAD01(定義上の1番目のRDエリア)となります。二次インデクス(IDX2)が格納されるRDエリアは,'BC'が「2番目の範囲」に該当するため,RDAREAI02(定義上の2番目のRDエリア)となります。
レコードが格納されるRDエリアと,二次インデクスが格納されるRDエリアの定義上の位置が対応していないため,STORE文はエラーになります。
- <子レコードの格納時に子レコードの二次インデクスをチェックする例>
-
二次インデクスのRDエリア分割キーにキーを指定していない二次インデクス(IDX3)について,格納されるRDエリアの対応をチェックする例です。この例では,ルートレコードはRDAREAD01(定義上の1番目のRDエリア)に格納されているものとします。
(例1)
STORE RECB SET UDB01='10', UDB02='WW'
- [説明]
-
二次インデクス(IDX3)が格納されるRDエリアは,'WW'が「最初の範囲」に該当するため,RDAREAI01(定義上の1番目のRDエリア)となります。レコードが格納されるRDエリアと,二次インデクスが格納されるRDエリアの両方とも定義上1番目のRDエリアとなり対応しているため,STORE文は正常終了します。
(例2)
STORE RECB SET UDB01='10', UDB02='XY'
- [説明]
-
二次インデクス(IDX3)が格納されるRDエリアは,'XY'が「2番目の範囲」に該当するため,RDAREAI02(定義上の2番目のRDエリア)となります。レコードが格納されるRDエリアと,二次インデクスが格納されるRDエリアの定義上の位置が対応していないため,STORE文はエラーになります。
-
(5) 使用例
- 例1
-
ルートレコードRECAにレコードを格納します。
STORE "RECA" FROM :WRECA
- 例2
-
DMLコマンドでルートレコードRECAにレコードを格納します。
STORE "RECA" SET "KEYDATA1"=X'01020304',"USERDA0"=200,"USERDB0"=100.2