0

スキーマmessageのデータベース テーブルに列があります。このテーブルは、システム ログ メッセージを格納することになっています。列のサイズは 255 で、データ型は. サイズが 255 文字を超えるメッセージを保存するために実装されたロジックは次のとおりです。fsr_system_logfsr_applvarchar2

public void saveSystemLog(SystemLogRequest systemLog){
    User user = systemLog.getUser();
    String system = systemLog.getSystem();
    Log log = systemLog.getSystemLog();

    try {
        initializeDelegate();
        delegate.beginTransaction();

        LogEntry[] logEntries = log.getItemArray();
        for (LogEntry logEntry : logEntries) {
            // Save each entry
            ParamVector<Object> params = new ParamVector<Object>();

            //Check if message is greater than 255 characters
            String message = logEntry.getMsg();
            notifier.debug("Log Message is : " + message);
            if(message.length()>255){
                message = message.substring(0,255);
                notifier().debug("Message string greater than 255 characters : " + message);
            }
            params.add(message, 255, false);
}

しかし、コードを実装しているにもかかわらず、次のエラーに直面しています:

SQL エラーのため、システム ログを保存できませんでした: ORA-12899: 列 "FSR_APPL" の値が大きすぎます。「FSR_SYSTEM_LOG」。"MESSAGE" (実際: 257、最大: 255)

使用されているサンプル ログは次のとおりです。

<xbe:systemLogRequest xmlns:xbe="http://tdc.dk/fsr/common/xbean">
<user>
    <userNumber>a62267</userNumber>
</user>
<system>Client</system>
<systemLog>
    <item>
        <timestamp>2011-10-27T17:03:08.404+02:00</timestamp>
        <type>Info</type>
        <msg><![CDATA[<html><center>Din registrering er nu sendt<br><br>Tak for indmeldingen</center></html>]]></msg>
    </item>
    <item>
        <timestamp>2011-10-27T17:03:13.701+02:00</timestamp>
        <type>Info</type>
        <msg><![CDATA[<html><center>Din registrering er nu sendt<br><br>Tak for indmeldingen</center></html>]]></msg>
    </item>
    <item>
        <timestamp>2011-10-28T12:45:47.801+02:00</timestamp>
        <type>Info</type>
        <msg><![CDATA[<html><center>Din registrering er nu sendt<br><br>Tak for indmeldingen</center></html>]]></msg>
    </item>
    <item>
        <timestamp>2011-10-28T12:45:57.926+02:00</timestamp>
        <type>Info</type>
        <msg>Afsluttet uden at gemme fejlregistering</msg>
    </item>
</systemLog>
</xbe:systemLogRequest>

助けてください!

注 :スローされるエラーは、特定のシステム ログ メッセージに対してのみ発生します。このエラーがスローされている場合、実際の値は常に定数 257 です。

4

3 に答える 3

1

どうやらあなたは複数のバイトで表されるいくつかの文字を持っています。

Javaでは、文字列の長さを文字数で取得しますが、Oracleは、列の定義方法が原因でバイト制限をチェックしているようです。

テーブルの定義を確認してください。おそらく、列はデフォルトの文字セマンティクスで定義されています。これはバイトです(ただし、Oracleのインストールによって異なります)。したがって、デフォルトでは次のようになります。VARCHAR2(255 Byte)

列を再定義すると、VARCHAR2(255 Char)問題はないはずです。

何かのようなもの:

CREATE TABLE FSR_SYSTEM_LOG
(
   ...
   MESSAGE  VARCHAR2(255 Char),
   ...
);

私には、XMLをそのような(長さの)制限された列に格納するのはかなり奇妙に思えます。XMLが255文字を超えないようにすることはできますか?メッセージをとして保存してみませんCLOBか?

于 2012-10-23T13:05:46.113 に答える
0

フィールド型を CLOB、BLOB、または XMLType に変更できます。Oracle のデータ型を調べると、VARCHAR2 はバイトでも機能するようです。

当然のことながら、フィールド タイプを変更したくない場合があります。

if(message.length()>255){
  message = message.substring(0,255);
  notifier().debug("Message string greater than 255 characters : " + message);
}

pos = 255
while (message.getBytes().size() > 255) {
  message = message.substring(0,pos--);
}
于 2012-10-23T14:05:52.733 に答える