12

アプリケーションにDevArtのdotConnectとEntityDeveloperを使用しています。エンティティファースト機能を使用してテーブルを作成しました。

多くの列タイプがCLOBに設定されていることに気付きました。私はMySQLとMicrosoftSQLServerの経験しか持っていないので、アプリケーションにCLOBを使用するかどうかはわかりません。少し読んだところ、CLOBは大量のデータ用であることがわかりました。

質問は次のとおりです。

  1. ユーザーの性別(varchar(1)である必要があります)やフルネームなど、ほとんどのフィールドにCLOBを使用できますか?CLOBフィールドをVARCHAR2に変換する手順では、列を削除してから再作成する必要があり、DevArtのエンティティエクスプローラーではバグがあるため、可能であれば避けたいと思います。編集:文字列フィールドの最大長を設定すると、自動的にVARCHAR2になることがわかりました。

  2. OracleにTINYTEXTに相当するものはありますか?

4

3 に答える 3

19

VARCHAR2(1)であるはずの列にCLOBデータ型を使用することは非常に悪い考えです。オーバーヘッド(Oracleは4000文字未満のインラインCLOBをVARCHAR2として扱うため、実際には最小限です)は別として、スキーマ内のデータの最も正確な表現を使用するように常に努力する必要があります。これは良い習慣です。

これは本当にDevArtツールの問題のように思えます。あるいは、おそらくそれを使用する方法を理解しているようです(違反はありません)。エンティティの属性のデータ型を指定する方法や、それらの仕様をOracleの物理データ型にマッピングする方法が必要です。これが少し漠然としているように思われる場合はお詫び申し上げます。私はこの製品に慣れていません。


したがって、これが基本的な問題です。

SQL> desc t69
 Name                                      Null?    Type
 ----------------------------------------- -------- --------
 COL1                                               CLOB

SQL>
SQL> alter table t69 modify col1 varchar2(1)
  2  /
alter table t69 modify col1 varchar2(1)
                       *
ERROR at line 1:
ORA-22859: invalid modification of columns


SQL>

DDLを使用してテーブル構造を変更することで修正できます。スキーマにはそのような列が多数あるため、プロセスを自動化する価値があります。この関数は、既存の列を削除し、それをVARCHAR2として再作成します。CLOB列のデータをVARCHAR2列に移行するオプションを提供します。おそらくこれは必要ありませんが、完全を期すためにあります。(これは本番品質のコードではありません。エラー処理、NOT NULL制約の管理などが必要です)

create or replace procedure clob2vc
  ( ptab in user_tables.table_name%type 
    , pcol in user_tab_columns.column_name%type
    , pcol_size in number
    , migrate_data in boolean := true )
is
begin
    if migrate_data
    then
        execute immediate 'alter table '||ptab
                    ||' add tmp_col varchar2('|| pcol_size|| ')';
        execute immediate             
                    'update '||ptab
                    ||' set tmp_col = substr('||pcol||',1,'||pcol_size||')';
    end if;
    execute immediate 'alter table '||ptab
                ||' drop column '|| pcol;

    if migrate_data
    then
        execute immediate 'alter table '||ptab
                    ||' rename column tmp_col to '|| pcol;
    else
        execute immediate 'alter table '||ptab
                    ||' add '||pcol||' varchar2('|| pcol_size|| ')';
    end if;
end;
/

それでは、その列を変更しましょう...

SQL> exec clob2vc ('T69', 'COL1', 1)

PL/SQL procedure successfully completed.

SQL> desc t69
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------
 COL1                                               VARCHAR2(1)

SQL>

このプロシージャの呼び出しは、通常の方法で自動化またはスクリプト化できます。

于 2011-04-20T13:55:16.323 に答える
8

列のようなものにCLOBを使用することGenderは、少なくとも非常に珍しいことです。このツールが生成するDDLで、LOBデータをライン外ではなくインラインで格納する必要があると指定されている場合、パフォーマンスのひどい問題になるとは思われません。ただし、LOBを特に適切に処理しない、データベースにアクセスする他のツールで問題が発生する可能性があります。

TinytextOracleにはMySQLに相当するものはありません。CLOBはCLOBです。

于 2011-04-20T13:51:56.867 に答える
4

より簡単な解決策は、Model Explorer-> Model.Store-> Tables / Viewsに移動し、必要な列を見つけて、このフィールドのタイプをVARCHAR2に変更することです。
次に、モデルからデータベースを更新ウィザードを実行して、データベースへの変更を永続化します。
MaxLengthファセットを設定することを忘れないでください(ただし、この問題は、今後のベータビルドですでに修正されています)。

于 2011-04-21T09:09:25.400 に答える