ホーム › フォーラム › A5:SQL Mk-2掲示板 › BLOB型のInsert文作成について
-
投稿者投稿
-
金ゲスト
いつもお世話になっております。
BLOB型を含むTBLデータのInsert文作成がうまくいきません。
【環境構成】
OS:Win7 64bit
DB:Oracle 11.2.0.1
A5:2.13.3、2.14.0_rc9データ行選択→レコードのコピー(その他フォーマット指定)→Insert文の順で選択すると、BLOB型のカラムも文字列(String)扱いとなるようです。—–①
従って、自分でスクリプトを作って、BLOBの場合はHEXTORAW()関数をくっつけてInsert文を作ろうとしております。しかしここでも問題があります。
rs.getFieldValue()の戻り値はString,Number,Date,Booleanの1つしかないようで(オンラインヘルプより確認しました)、str.charCodeAt()による16進数の値が正しくなくなります。でも手動でSQLを作成してもBLOBデータのサイズが大きい場合は、Insertの時ORA-01704が発生し、やはりだめなのかなと思います。—-②
上記①と②の解決案や回避策などありませんでしょうか。金ゲストいつもお世話になっております。
上記の件ですが、Encoding.getBytes()で何とか行けそうです。
できましたらまた共有させていただきます。金ゲストEncoding.getBytes()で取得したBytes配列の各要素に対して、toString(16)で16進数のデータが取得できました。
ただ、「0A」が「A」になるなど、桁数が揃えない場合があるので、0埋め処理を追加しました。
また、上記②のORA-01704を回避するために UTL_RAW.CONCAT() も使ってみましたが、今度は「RAW変数の長さが長すぎます。」というエラーで怒られました。まぁ、そもそも長すぎる場合下記のスクリプト自体の効率も悪いので、データ長が2000を超える場合のみ対応するようにしました。
\scripts\TreeTB\InsertStatements.dms をもとに変更:
==================================================
case application.ftOraBlob:
if (columnData.length == 0) {
columnData = “EMPTY_BLOB()”;
} else {
var bArr = Encoding.getBytes(columnData);
var strHex = “”;
// “RAW変数の長さが長すぎます。”エラーが発生するため
if (columnData.length < 2000) {
for (var i=0;i<bArr.length;i++) {
var curByteHex = bArr[i].toString(16);
if (curByteHex.length == 1) {
// 0埋めが必要な場合がある
strHex = strHex + “0” + curByteHex;
} else {
strHex = strHex + curByteHex;
}
}
columnData = “HEXTORAW(‘” + strHex + “‘)”;
} else {
// SQL ではサイズ制限があるため、EMPTY_BLOB とする。
columnData = “EMPTY_BLOB()/* 要手動対応 */”;
}
}
break;
以上、共有とさせていただきました。松原正和キーマスター金さんこんにちは。
ありがとうございます。確かにBLOBに限らず様々な型でINSERT文やUPDATE文の生成は少し怪しいかもしれないですね。将来のバージョンで取り込ませていただくかもです。
以上よろしくお願いいたします。 -
投稿者投稿