Oracle 11gには、varchar2列を持つテーブルがあります。この列が文字列として定義されている独自のプログラミング言語を使用しています。この列には最大2000文字(4000バイト)を格納できます。現在、要件は、列に2000文字以上(実際には無制限の文字)を格納する必要があるというものです。 DBAは、メンテナンス上の理由から、BLOBまたはLONGデータ型を好みません。
私が考えることができる解決策は、元のテーブルからこの列を削除し、この列に個別のテーブルを用意してから、無制限の文字を取得するために各文字を1行に格納することです。このテーブルは、クエリ用に元のテーブルと結合されます。
この問題に対するより良い解決策はありますか?
更新:プロプライエタリプログラミング言語では、文字列型とblob型の変数を定義できますが、CLOBのオプションはありません。回答は理解できましたが、DBAを引き受けることができません。 BLOBまたはLONGから逸脱することは開発者の悪夢になることを理解していますが、それでもそれを助けることはできません。
更新2:必要な最大文字数が8000文字の場合、さらに3列を追加して、それぞれ2000文字の4列を作成し、8000文字を取得できますか。したがって、最初の列がいっぱいになると、値は次の列に波及します。このデザインには悪い副作用がありますか?提案してください。
ブロブが必要なものである場合、dbaを納得させる必要があります。これらのデータ型には理由があり、独自のロールの実装は組み込み型よりも悪くなります。
また、 [〜#〜] clob [〜#〜] タイプも確認することをお勧めします。これは、ニーズを十分に満たすためです。
Oracleがストアドプロシージャを情報スキーマに格納した方法に従うことができます。テキスト列と呼ばれるテーブルを定義します。
CREATE TABLE MY_TEXT (
IDENTIFIER INT,
LINE INT,
TEXT VARCHAR2 (4000),
PRIMARY KEY (INDENTIFIER, LINE));
識別子列は、元のテーブルへの外部キーです。 Lineは、テキストフィールドを順番に保つための単純な整数(シーケンスではありません)です。これにより、より大きなデータチャンクを保持できます
はい、これはblob、clob、またはLONGほど効率的ではありません(可能な限りLONGフィールドは避けます)。はい、これにはより多くのメンテナンスが必要です。データベース内のCLOBフィールドの管理に対してDBAが完全に設定されている場合、これはオプション2です。
編集:
以下のMy_Tableは、現在展開しようとしているVARCHAR列がある場所です。短いテキストフィールドのテーブルに保持します。
CREATE TABLE MY_TABLE (
INDENTIFER INT,
OTHER_FIELD VARCHAR2(10),
REQUIRED_TEXT VARCHAR(4000),
PRIMERY KEY (IDENTFIER));
次に、MY_TEXTフィールドのLINE順に並べて、2つのテーブルを結合するデータをプルするクエリを記述します。アプリケーションは、文字列を2000文字のチャンクに分割し、それらを行順に挿入する必要があります。
これは、PL/SQLプロシージャで行います。挿入と選択の両方。 PL/SQLVARCHAR文字列は最大32K文字です。これは、ニーズに十分な大きさである場合とそうでない場合があります。
しかし、この質問に答える他のすべての人と同様に、列をCLOBにするためにDBAにケースを作成することを強くお勧めします。プログラムの観点からは、これはBLOBであるため、管理が簡単です。
あなたはBLOBもLONGも言わなかった...しかしCLOBはどうですか? 4GBの文字データ。
わかりません。 CLOBは、適切なデータベースデータ型です。奇妙なプログラミング言語が8000(または何でも)文字の文字列を処理する場合、CLOBへの書き込みを停止するのは何ですか。
具体的には、CLOBとして定義された列に8000文字の文字列を挿入しようとすると、(Oracleまたはプログラミング言語から)どのようなエラーが発生しますか。
BLOBが最適なソリューションです。それ以外のものは、利便性が低下し、メンテナンスの煩わしさが大きくなります。
BFILEはDBAの実行可能な代替データ型ですか?