1

Informix 11.70 データベースを使用しています。テーブルに対してこの挿入ステートメントを正常に実行できません。

INSERT INTO some_table(
    col1,
    col2,
    text_col,
    col3) 
VALUES(
    5, 
    50, 
    CAST('"id","title1","title2"
"row1","some data","some other data"
"row2","some data","some other"' AS TEXT), 
    3);

私が受け取るエラーは次のとおりです。

[エラー コード: -9634、SQL 状態: IX000] 文字からテキストへのキャストがありません。

テキストリテラルで新しい行を使用できるようにするには、このステートメントを追加する必要があることがわかったので、既に記述した同じクエリの上にこれを追加しました。

EXECUTE PROCEDURE IFX_ALLOW_NEWLINE('t');

それでも、同じエラーが表示されます。

また、次のようなIBMのドキュメントも読みました。代わりに、新しい行を許可するALLOW_NEWLINEには、ファイルにパラメーターを設定できONCONFIGます。私が持っていない構成ファイルを変更するには、最後のものではサーバーへの管理アクセスが必要であり、この設定を利用したくないと思います。

4

2 に答える 2

3

Informix の TEXT (および BYTE) 列は、どの標準よりも古いものであり、多くの点で非常に特殊な型です。Informix の TEXT は、他の DBMS の TEXT とは大きく異なります。それらに関する長年 (20 年以上) の問題の 1 つは、それらにデータを挿入するために使用できる文字列リテラル表記がないことです。「char から text へのキャストなし」は、文字列リテラルから TEXT への明示的な変換もないと言っています。

さまざまなオプションがあります。

  • テーブルで LVARCHAR を使用します (行の合計の長さが約 32 KiB であるため、値が数 KiB より長くない場合に適しています)。LVARCHAR 列の最大サイズは 32 KiB 弱です。
  • Informix の「ロケータ」構造を処理できるプログラミング言語を使用します。ESQL/C では、TEXT を保持するために使用される型はloc_tです。
  • 代わりに CLOB の使用を検討してください。ただし、これには同じ制限があります (文字列から CLOB への変換はありません) が、FILETOCLOB()関数を使用して、クライアント上のファイルからデータベースに情報を取得できます (またLOTOFILE、DB からサーバー上のファイルに情報を転送します)。クライアント)。

LVARCHAR を使用できる場合は、それが最も簡単な代替手段です。

于 2012-05-07T14:21:03.830 に答える
0

質問の重要な詳細について言及するのを忘れていました.JavaとHibernate ORMを使用してInformixデータベースにアクセスしているため、 Jonathan Lefflerの回答loc_tで提案されているアプローチの一部(特に処理)は残念ながら適用されません. また、動的な長さの大きなデータを保存する必要があり、列がそれを保持するのに十分ではないのではないかと心配しています。LVARCHAR

私がそれを機能させた方法は、Michał Niklasのコメントからの提案に従い、 を使用することPreparedStatementでした。これは、InformixTEXTが独自の方法でデータ型を処理することで説明できる可能性があります。

于 2014-05-15T21:46:00.980 に答える