9

私はJavaとOracleとのデータベース接続でコードを作成します。スクリプトを実行すると、このエラーが発生します。スクリプトはヒキガエルでは機能しますが、プロジェクトでは機能しません。

urlinclude。

.
.
.
.
    DECODE
                 (REF.target_type_code,
                  '1', wf.workflow_name,
                  '20', reqtyp.request_type_name,
                  '6', prj1.project_name,
                  '59', trootinfo1.NAME,
                  '55', DECODE
                     (document.checked_out_by,
                      NULL, 
                      REPLACE
                         (REPLACE
                             (REPLACE
                                 (REPLACE
                                     (REPLACE
                                         (knta_i18n_resource.get
                                             ('DMS_REFERENCE_DETAIL_CHECKED_OUT.TXT'
                                             ),
                                          knta_i18n_format_utils.format_date
                                                        (document.checked_in_date,
                                                         3 
                                                        )
                                         )
                                     ),
                                  document.version_number
                                 ) 
                             ),
                          '{4}' 
                         )
                     )
                 ) reference_detail,

.
.
.

try { 
    stmt = connection.createStatement(); 
    rset =   stmt.executeQuery(url) ;  
}  catch (Exception e) 

{  
    error= e.getLocalizedMessage() ;
    return 4; 
}

このエラーは、{}括弧が原因で発生します。私はそれをテストします。括弧を削除してもエラーは発生しません。しかし、私はそれらが必要であり、どうすればこれを修正できますか?

4

5 に答える 5

16

{それ はすべてについて}です。あなたはそれらを使用しません。Ojdbcはそれを解析しません。それらの代わりに別のトークンを使用してください。

于 2012-09-05T12:36:03.203 に答える
3

これは、JDBC Escape構文が原因である可能性があります(JDBC 4.1仕様のセクション13.4を参照)。JDBCドライバーは、との間のエスケープを処理{し、エスケープされ}た標準関数、外部結合などをデータベース固有の形式に変換する必要があります。

私の知る限り、ドライバーは、ステートメントの本文内で発生した場合にのみエスケープを解析する必要があり、ステートメントのテキスト内にある場合は解析しないでください(例のように)。したがって、これはドライバーのJDBCエスケープ処理のバグのように見えます。

于 2012-09-08T08:12:28.163 に答える
1

別のStackOverflow投稿の回答に従うことでこれを回避できる可能性があります: JDBCを使用してOracleデータベースにJavaを作成する

要約は次のとおりです。

CallableStatement stat = conn.prepareCall(sql);
stat.setEscapeProcessing(false);
stat.execute();

真ん中の線はあなたが欠けているように見えるものです。その投稿を見つけるまで、私はそれを理解することができませんでした。

于 2018-04-10T21:51:16.003 に答える
0

REPLACE呼び出しのいくつかには十分な引数がないようです。左から数えると、最初のREPLACEには2つの引数があります。2番目の引数は1つだけです。3番目には2つの引数があります。4番目の引数は1つだけです。5番目(最後)には2つの引数があります。Oracleでは、REPLACE関数には少なくとも2つの引数が必要です。完全なステートメントを投稿していないため、これがエラーの原因であるかどうかを判断することはできませんが、REPLACEに対する適切な引数の欠如が問題になることは確かです。

共有してお楽しみください。

于 2012-09-04T11:18:52.847 に答える
0

スクリプト内でに'{4}'置き換えます。CHR(123)||'4'||CHR(125)

于 2019-08-22T16:12:04.520 に答える