• 締切済み

oracle11gで、PL/SQLにてAというテーブル内の項目にCLO

oracle11gで、PL/SQLにてAというテーブル内の項目にCLOB型のデータがあります。 そのCLOB型項目を別テーブルの1、2、3のVERCHAR2型にそれぞれ4000バイトずつに 振り分けたいと考えています。 CLOB型ですと、DBMS_LOB.SUBSTRを使用する方法等があると思いますが、バイト数で振り分ける方法なないものでしょうか? 教えて頂きますようお願いします。

みんなの回答

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.4

VARCHAR2(4000 CHAR)を実際の環境で確認しました。 4000バイトの制限がありますね。私の勘違いでした、申し訳ありません。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.3

マニュアルの記述です。 VARCHAR2(size [BYTE | CHAR]) 最大長がsize バイトまたはsize 文字の可変長文字列。最大サイズ は4000、最小サイズは1 です。VARCHAR2 には、size を指定する 必要があります。 BYTE は、列がバイト長セマンティクスを持つことを示し、CHAR は、列がキャラクタ・セマンティクスを持つことを示します。 となってます。sizeの最大が4000バイトとはなってませんね。4000文字でしょうね。 そちらに環境があるなら、簡単にVARCHAR2(10 CHAR)と定義して、 半角10バイトと全角10文字の2行をinsertして確認してみてください。 泣き別れですが、泣き別れで半角同士で文字として有効な値で無い場合には 値が無視されたりしますよ。たぶんですが。 全角文字を入れた項目をsubstrbでバイト単位で取り出してみてください。 また、この文字にならない値の扱いはバーションやマイナーバージョンで変わったりする可能性が あるので、注意が必要です。

77kun
質問者

お礼

ありがとうございます。 ご親切に教えていただきまして有り難うございます。 実際に試してみた所、教えて頂いた結果になりました。 この様な方法もあるのですね。マニュアルも確認致しました。 マニュアルにも記載されておりましたが、4000文字で4000バイト超えるとデータベース上エラーが出て登録が出来ないんですね・・・・。 PL/SQL上では4000バイト以上で処理が出来るみたいなのですが、変数を使用しVARCHAR2(size [BYTE | CHAR])でCLOBの文字を変数に代入してから、SUBSTRBでバイト分割が出来るかと思ったのですが、 これもCLOBでは使用できないと言うようなメッセージが出てしまいました。 このような考え方は間違っていたのでしょうか? う~ん困りました。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.2

VARCHAR2(4000 CHAR) の場合、4000文字ですから半角、全角混在で4000文字でしょう。 今、手元に環境がないので確認できませんが。 半角、全角混在のCLOBから4000バイト取り出すと、 全角の泣き別れ(全角の上位桁、下位桁の分割)が発生しませんか? そもそも、CLOBをVARCHAR2に分割する理由は何ですか?

77kun
質問者

お礼

ありがとうございます。 教えて頂きましたVARCHAR2(4000 CHAR)と指定すると、 VARCHAR2の4000バイトまでというのは関係なくなるという事でしょうか? 分割する理由にはなっていないと思いますが、CLOB型で一つの項目とし扱う事でも良いとは思ったのですが、色々な理由から項目を分ける形になり、それらを合わせて画面に表示させるという仕組みになります。 上記の事より、データベース上全角の泣き別れが起きたとしても結果は合わさる事になり問題ないかと考えております。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

バイトでないとだめなのでしょうか? VARCHAR2型はVARCHAR2(4000 CHAR)と書けば4000文字格納できます。

77kun
質問者

お礼

ご回答ありがとうございます。 実は、CLOB型には半角、全角が混在しております。 その為、バイト数で判断したいと考えておりますが・・・。 教えて頂きました方法で混在していた場合、4000文字を格納するとエラーになるのでしょうか?

関連するQ&A