4

関数を呼び出し、名前でいくつかのパラメーターを設定します。例:

    Connection c = null;
    ResultSet rs = null;
    String query;
    PreparedStatement ps;
    CallableStatement cs = null;
    try {
        c = DbUtils.getConnection();
        cs = c.prepareCall("{? = call get_proc_name(?, ?) }");
        cs.registerOutParameter(1, OracleTypes.VARCHAR);
        cs.setInt("in_proc_type", ProcTypes.SELECT);
        cs.setLong("in_table_id", tableId);
        // here I should use something like cs.registerOutParameter("result", OracleTypes.VARCHAR);
        cs.execute();

PL/SQL関数のパラメータは次のとおりです。

CREATE OR REPLACE FUNCTION get_proc_name
(
  in_proc_type IN NUMBER, /*1 - insert, 2 - update, 3 - delete, 4 - select*/
  in_table_name IN VARCHAR2 := NULL,
  in_table_id IN NUMBER := NULL,
  in_table_type_id IN NUMBER := NULL,
  is_new IN NUMBER := 0
) RETURN VARCHAR2

問題は、結果をoutパラメータとして登録し、それをoracleからjavaに取得する方法です。関数からパラメータの名前を知っているので、名前でin / outパラメータを登録できますが、関数の結果を取得する方法、変数名がどのように使用するかがわかりません。

マニュアルでは、関数ではなく、プロシージャを使用したin/outパラメータの使用法についてのみ説明しています。

Oracleバージョン:11.1.0.6.0 Javaバージョン:1.6.0_14

4

3 に答える 3

3

解決策は、設定パラメーターにインデックスのみを使用することです。このようなコードは期待どおりに機能します(インデックスと名前付きパラメーターの混合は機能しません。したがって、結果変数に名前付きパラメーターを使用する問題は解決できませんでした、imho):

            c = DbUtils.getConnection();
            cs = c.prepareCall("{? = call get_proc_name(in_proc_type => ?, in_table_id => ?) }");
            cs.registerOutParameter(1, java.sql.Types.VARCHAR);
            cs.setInt(2, ProcTypes.SELECT);
            cs.setLong(3, tableId);
            cs.execute();
            String procName = cs.getString(1);
            cs.close();
于 2010-09-13T12:25:16.337 に答える
1

CallableStatementregisterXXXインデックスを取得するメソッドがたくさんあります。

それが結果を登録する方法です。パラメータ番号1です。

あなたの場合、

cs.registerOutParameter( 1, java.sql.Types.VARCHAR);

<SPECULATION>
ところで、のインデックスを使用しているためresult、インデックス指向のsetXXXメソッドを使用して、完全なパラメータリストを提供する必要がある場合があります。
</ SPECULATION>

于 2010-09-13T11:31:45.830 に答える
0

関数の結果を最初のパラメーターであるかのように登録します。明らかに、これにより実際のパラメーターの番号がシフトします。

あなたの既存のライン

cs.registerOutParameter(1, OracleTypes.VARCHAR);

必要なのはそれだけです。電話の後、次のような結果を取得します。

String result = cs.getString(1);
于 2010-09-13T11:44:27.857 に答える