式項目をSubTypeで使用しようとして苦労したので、どんなことが起こったのかをまとめました。
そもそも式項目をSubTypeで使用するような複雑な作り方はしたくないのですが…。
1.SubType定義
式項目をSubTypeで使用する場合は式で使用する全ての項目をSubTypeオブジェクト上で定義する必要があり、すべて定義すれば使用できる、と思っていました。
例)
トランザクションA
・項目A(主キー)
・項目a
・項目b
・項目c
・式項目d …IIF(a=b,c,0)
トランザクションBで式項目dを別名称で使用したい場合
SubTypeに式項目dだけでなくa~cをスーパータイプとした項目を定義することになります。
2.実行結果
定義が完了し実行してみたところ、「ORA-12704:文字セットが一致しません。」
なんと…
3.何が起こっているのか
式項目dはトランザクションAの項目a~cを使用して演算しています。
トランザクションBでは式項目dを使用するための項目a~cをSubTypeで別名定義しました。
トランザクションBにはa~cという名称の項目は存在していないので式が成立しませんよと怒られていたようです。
SubTypeで式項目dを構成する項目が紐づいてはいるのですが、紐づいた項目が式項目dを構成する項目であるという暗黙的変換はしてくれないようです。
例)
トランザクションB
・項目B(主キー)
・項目B_a ⇒SuperType:トランザクションA.a
・項目B_b ⇒SuperType:トランザクションA.b
・項目B_c ⇒SuperType:トランザクションA.c
・項目B_d ⇒SuperType:トランザクションA.d …式項目:IIF(a=b,c,0)
項目B-aは式項目で使用しているaである という変換は行われない模様
4.解決方法
式項目を構成する項目のみSubTypeで定義し、定義したSubType項目を使用してトランザクションB独自の式項目を新たに定義することによって、トランザクションAの式項目d同等の値を得ることができました。
例)
トランザクションB
・項目B(主キー)
・項目B_a ⇒SuperType:トランザクションA.a
・項目B_b ⇒SuperType:トランザクションA.b
・項目B_c ⇒SuperType:トランザクションA.c
・式項目e …式項目:IIF(B_a=B_b,B_c,0)