A5:SQL Mk-2

開発のこと、日々のこと

BLOB型のInsert文作成について

ホーム フォーラム A5:SQL Mk-2掲示板 BLOB型のInsert文作成について

4件の投稿を表示中 - 1 - 4件目 (全4件中)
  • 投稿者
    投稿
  • #3871 返信
    ゲスト

    いつもお世話になっております。
    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が発生し、やはりだめなのかなと思います。—-②
     
    上記①と②の解決案や回避策などありませんでしょうか。

    #3872 返信
    ゲスト

    いつもお世話になっております。
     
    上記の件ですが、Encoding.getBytes()で何とか行けそうです。
    できましたらまた共有させていただきます。

    #3885 返信
    ゲスト

    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;
     
     
    以上、共有とさせていただきました。

    #3927 返信
    松原正和
    キーマスター

    金さんこんにちは。
     
    ありがとうございます。確かにBLOBに限らず様々な型でINSERT文やUPDATE文の生成は少し怪しいかもしれないですね。将来のバージョンで取り込ませていただくかもです。
     
    以上よろしくお願いいたします。

4件の投稿を表示中 - 1 - 4件目 (全4件中)
返信先: BLOB型のInsert文作成についてで#3927に返信
あなたの情報:




コメントは受け付けていません。