0

こんなお問い合わせが..

String query = "UPDATE tbl_customer_policies SET "+
        "start_date = ?," + 
        "next_pay_date = ?,"+
        "maturity_date = ?, " + 
        "modified_at = CURRENT_TIMESTAMP,"+
        "modifier = ?, status = ? " + 
        "WHERE id = ?";

プレースホルダーの代わりに、 の start_dateような文字列を渡したいと思いSYSDATEます。

私が今行っているのは、その文字列をという変数に設定し、String startDate = "SYSDATE"そのプレースホルダーにバインドすることです。しかし、うまくいかないようです。この例外が発生します

ORA-01858: 数値が必要な場所に数値以外の文字が見つかりました

そのようなOracle関数を渡す必要があります。それを達成する方法は?

4

2 に答える 2

2

常にそうなるsysdate場合は、パラメータ化する必要はありません。次のようにクエリで直接設定します。

String query = "UPDATE tbl_customer_policies SET "+
        "start_date = sysdate," + // or "start_date = ADD_MONTHS(SYSDATE, 12),"
        "next_pay_date = ?,"+
        "maturity_date = ?, " + 
        "modified_at = CURRENT_TIMESTAMP,"+
        "modifier = ?, status = ? " + 
        "WHERE id = ?";

そして、以前と同じように他のすべてのパラメータを設定します。

于 2013-03-10T08:57:32.630 に答える
0

たとえば、関数 TO_DATE ( docs ) を使用します

    "UPDATE tbl_customer_policies SET "+
     "start_date = TO_DATE(?, 'DD-MON-RR')," + 
    "next_pay_date = TO_DATE(?, 'DD-MON-RR'),"+

この場合、「27-OCT-98」のような形式でパラメーターを渡すことを忘れないでください。

PS私は質問を誤解したので、私の答えを修正してみてください。

説明されている問題は、PreparedStatement Java クラスの制限に関するものです。PreparedStatement オブジェクトは、プリコンパイル済み (および最適化済み) の SQL ステートメントへの参照を格納するために使用されます。
したがって、それらを埋めるためのパラメーターの値のみを指定する必要があります。関数は結果を使用する前に評価する必要があり、そこに配置することはできません。

Oracle Structured Typesで回避策を使用できると思います。これらは、PreparedStatement の setRef() メソッドを使用して参照型として渡すことができます。関数の使用は、オブジェクトのコンストラクターのラッパーで実装できます。私はそれを試しませんでしたが、それは可能な解決策のようです。

于 2013-03-11T10:16:07.500 に答える