ホーム   フォーラム   FAQ
 
メインメニュー
ログイン
ユーザー名:

パスワード:


パスワード紛失

Oracle DATETIME型項目への更新

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 .4 | 投稿日時 2011-7-27 18:58
aita  新米   投稿数: 3
お世話になっております。

jBOLT EXpedition V3 SP1を使用し、
'YYYY/MM/DD HH24:MI:SS'の形式の文字列を元にOracleの DATETIME型 の項目へ更新しようとしています。

ヘルプの「jBOLTでDateTimeデータベース項目を使用する」の内容、
こちらのフォーラムの既出の質問「MS SQL Server 2005 のmoney,datetimeのデータ型の変換について」の回答を参考に
data_types.xml 及びjBOLTロジックの修正を行いましたが、oracleのDATETIME型の項目に対し正しく更新が行えません。

対処法をご存知の方がいらっしゃいましたらご教示ください。


【定義内容】
■data_types.xml修正内容
・修正前
----------------------------------------------------------------
<Mapping>
<GW>99</GW>
<From_DB_Type>DATE </From_DB_Type>
<To_Data_Type>Date</To_Data_Type>
<MagicPic>YYYY/MM/DD</MagicPic>
<StoredSize>8 </StoredSize>
<StoredAs></StoredAs>
<StoradAsNumber>19</StoradAsNumber>
<StoredType></StoredType>
</Mapping>
----------------------------------------------------------------

・修正後
----------------------------------------------------------------
<Mapping>
<GW>99</GW>
<From_DB_Type>DATE</From_DB_Type>
<To_Data_Type>STRINGDATE</To_Data_Type>
<MagicPic/>
<StoredSize/>
<StoredAs>ZString</StoredAs>
<StoradAsNumber>3</StoradAsNumber>
<StoredType></StoredType>
</Mapping>
----------------------------------------------------------------

※データマッパー-送り先のノード特性画面のデータタイプが「DATE(19)」となっていたため、
<From_DB_Type>DATE</From_DB_Type>のブロックを修正しました。
 jBOLTは終了した状態でxmlファイルの修正を行っています。


■データマッパー設定
データマッパー-送り先
 alter session set NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'を追加

ノード特性画面
 書式:19は修正していません。

※xmlファイル更新前はノード特性画面にStringDateのチェックボックスがありましたが、
更新後はSrtingDateのチェックボックスが消え、「DATE(19)」の表示は変わりません。
 

【障害内容】
処理を実行し、Mapper.logよりSQL文を確認したところ、
Insert時のVALUE句に「2011/07/15 10:11:12」とシングルコーテーションなしの文字列が出力されていました。
SQLPlus でデータをSelectしたところ、「2011/10/69 00:00:00」が表示されました。

以上の現象をwindows7 Professional 32bit、windowsXP Professional 32bit SP2 にjBOLTをインストールした環境で確認しました。
DATETIME型に更新する部分のみのプロジェクトを作成しましたが、現象に変わりありませんでした。



xmlファイルの修正内容が間違っていますでしょうか。
MSSQLとOracleの違いにより data_types.xml の修正内容の違い等ありますでしょうか。

また、開発環境のデータベースはORACLE10gR2、実際の運用はORACLE11gR2を予定しています。
oracleのバージョンの違いによるxmlファイルの編集内容の違いなどありましたらご教示ください。


以上、大変お手数をおかけ致しますが、何卒ご回答宜しくお願い致します。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2011-7-30 20:23 | 最終変更
Jiro123  長老   投稿数: 271
今手元にjBOLT3.0がないので、試す環境がありませんが、ご参考になれば。。。

StringDateにチェックするのは試されましたか。

試されたことはすべて記載されると、投稿者がレスするのにも、とても参考になって、いろいろと状況がわかり、とても助かると思います。

書くのは面倒なのは分かりますが。。。

投稿した後、『既に試してうまくいかなかいから、投稿したんだけど』というような回答が返されと、投稿者の投稿が無駄となり、報われないことになり、とても辛いと思います。

『MS SQL Server 2005 のmoney,datetimeのデータ型の変換について』は、MS SQLServer に関することなので、この回答のdata_types.xml修正は、SQLServer用の修正方法であるので、多分、Oracleでは修正方法が違うと思いますよ。

また、ミリ秒単位までの更新をしたいという場合に、この修正を行う必要がありました。

Oracleの場合、Date型はミリ秒単位までは確か扱わなかったと思いますので、StringDateにチェックして、日付項目を<文字列>として扱うようにすれば対応できたように思います。

その際、修正されたdata_types.xmlは元に戻すのを忘れないようにしてください。

日付項目を文字列として扱うようにすれば、Oracleに発行されるクエリの日付部分の前後には、「'」が付くと思います。

付かない場合は、付けたSQLが発行されるようにSQLを書けばよいと思います。

参考になれば幸いです。

投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2011-8-1 20:10
aita  新米   投稿数: 3
Jiro123様

ご返答ありがとうございます。

説明が不足しており、大変申し訳ありません。
質問に回答してくださる方が二度手間とならないよう、以後質問する際には気をつけます。

それでは試した内容を記載させて頂きます。


■xmlファイル修正
<Mapping>
<GW>99</GW>
<From_DB_Type>DATE </From_DB_Type>
<To_Data_Type>String</To_Data_Type>
<MagicPic>YYYY/MM/DD HH:MM:SS</MagicPic>
<StoredSize>14 </StoredSize>
<StoredAs></StoredAs>
<StoradAsNumber>19</StoradAsNumber>
<StoredType></StoredType>
</Mapping>

データマッパーノード特性の計算値:「'2011/07/15 10:11:12'」(固定で渡しました)
insert後selectを行うと、「2011/10/69 00:00:00」のように、不正な日付がselectされました。



また、Jiro123様のご返答を元にStringDateにチェックを入れ実行したところ、Mapper.logのValue句はシングルコーテーションが付いていない状態だったため、下記の4点の内容を試しました。


【1】ASCIIChrを用いてシングルコーテーション付加

DBオペレーション:Insert
データマッパーノード特性の計算値:「ASCIIChr (39) & '2011/08/01 12:34:56' & ASCIIChr (39)」
と定義し、Mapper.logで確認したところ、「'2011/08/01 12:34:5」となっており、19Byteで切られていました。
(SqlPlusでのSELECT結果は「8799/09/08 00:00:00」でした)


【2】書式を'YYYYMMDDHH24MISS'に変更(「'」付き)

19Byteで切られたため、alter session set NLS_DATE_FORMAT='YYYYMMDDHH24MISS'とし、
DBオペレーション:Insert
データマッパーノード特性の計算値:「ASCIIChr (39) & '20110801123456' & ASCIIChr (39)」
と定義し、Mapper.logで確認したところ、「'20110801123456'」となっており、
SqlPlusでのSELECT結果は「8799/10/80 00:00:00」でした。


【3】書式を'YYYYMMDDHH24MISS'に変更(「'」なし)

DBオペレーション:Insert
データマッパーノード特性の計算値:「'20110801123456'」
と定義し、Mapper.logで確認したところ、「20110801123456」となっており、
SqlPlusでのSELECT結果は「2011/08/01 00:00:00」でした。


【4】既出の質問「ストアドプロシージャとストアドファンクションの呼び出し」
でSQLServerの内容ではありますが、直接SQL文を発行する方法がありましたので試しました。

DBオペレーション:Delete
送り先SQL文「Insert into スキーマ名.テーブル名 (テーブル名.文字型列名,テーブル名.数値型列名,テーブル名.DATETIME型列名) values ('a',1,TO_DATE('20110801123456','YYYYMMDDHH24MISS'));」
と定義し、Mapper.logで確認したところ、「Delete FROM t into スキーマ名.テーブル名 (テーブル名.文字型列名,テーブル名.XXX」
となっており、SQL文が自分で書いたInsert文からDelete文になっていて、SQLの途中で切れている状態です。
selectしても行が作成されていませんでした。

また、Mapper.logに「Error ORA-00911: 文字が無効です。」と出力されていました。
(送り先に入力したSQLが正しいことは確認済です。)



以上の内容を試しましたが、DATETIME型に対し正しく更新が行えていない状態です。


もしこれ以外にも設定すべき点や違ったやり方などありましたらご教示ください。

どうか宜しくお願い致します。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2011-8-1 20:31
yoshi  半人前   投稿数: 33
みなさん、こんにちは

Jiro123様の手順と同じですが、
以前、この手順でdateタイプを更新したことがあります。
※xmlファイルの更新は実施していません。

1.datamapper送り先のノード特性を開く
2.StringDateのチェックを確認。併せて書式が19になっていることを確認。
3.下記書式で日付・時間をセット
  YYYY-MM-DD HH:MM:SS

参考になれば幸いです。

投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2011-8-2 10:16 | 最終変更
aita  新米   投稿数: 3
yoshi様

ご返答ありがとうございます。

yoshi様の手順どおりに記述しましたところ、正しい値で更新を行うことができました。

計算値に'YYYY/MM/DD HH24:MI:SS'の書式で文字列を入れていましたが、
'YYYY-MM-DD HH24:MI:SS'の書式で文字列を入れることで解決致しました。

Jiro123様、yoshi様ありがとうございました。
投票数:0 平均点:0.00

  条件検索へ


Copyright (C) Magic Software Japan K.K. All Rights Reserved.
個人情報保護方針 会員規約