4

私は Play フレームワーク 1.2.5 を使用しています。ストアド プロシージャを作成して使用することで SQL クエリを最適化したいのですが、その方法がわかりません。

Java コードを使用してストアド プロシージャを作成するには、どうすればよいですか? また、アプリケーションの起動時にプロシージャが確実に作成および保存されるように、 @OnApplicationStart ジョブで実行する必要がありますか?

その後、ストアド プロシージャをどのように使用できますか? どの機能を使用しますか? パラメータをプロシージャに渡すにはどうすればよいですか? 手順の結果を取得するにはどうすればよいですか? (通常、結果は SELECT クエリになります) 最後に、私の手順の結果を play フレームワークのモデルにバインドすることは可能ですか?

たくさんの質問がありますが、プレイ フレームワークと JPA を使用したスト​​アド プロシージャは初めてなので、それらを正しく使用していることを確認したいと思います。

ご協力ありがとうございました

4

2 に答える 2

4

どうやって作成すればいいのかわかりません。おそらく、OnApplicationStartメソッドが必要です。私の環境では、手順はすでに実施されています。Playを使用してそれらを呼び出します。ストアドプロシージャを呼び出すには、Workインターフェイスを確認する必要があります。これを実装することにより、データベースでステートメントを実行できます。

基本的なOracleProcedureクラスを作成しました。

public class CallOracleProcedure implements Work {

    private String anonymousPLSQL;
    private String[] parameters;

    public CallOracleProcedure(String anonymousPLSQL, String[] parameters) {
        this.anonymousPLSQL = anonymousPLSQL;
        this.parameters = parameters.clone();
    }

    /**
     * Create a JDBC PreparedStatement and then execute the anonymous
     * PL/SQL procedure.
     */
    @Override
    public void execute(Connection connection) {
        PreparedStatement statement = null;
        try {
            statement = connection.prepareStatement("begin " + anonymousPLSQL + "; end;");

            if (parameters != null) {
                int i = 1;
                for (String param : parameters) {
                    statement.setString(i++, param);
                }
            }
            statement.executeUpdate();
        } catch (SQLException e) {
            Logger.error("Error performing anonymous pl/sql statement: '%s', with parameters: '%s' - catched error '%s'", anonymousPLSQL, parameters, e);
        } finally {
            if (statement != null) {
                try {
                    statement.close();
                } catch (Exception e) {
                    Logger.error("Error closing statement: %s", e);
                }
            }
        }
    }
}

特定のストアドプロシージャごとに、このクラスを拡張し、次の方法で名前とパラメータをコンストラクタに渡すことができますsuper()

public class StoredProcedureCall extends CallOracleProcedure {
    public StoredProcedureCall(String param) {
        super("package.storedprocedure(?)", new String[] { orgname });
    }
}

コードでは、次のように呼び出すことができます。

StoredProcedureCall procedure = new StoredProcedureCall("your parameter");
session.doWork(procedure);

プロシージャを呼び出して戻り値を取得する必要がある場合CallableStatementは、execute()メソッドでaを使用できます。

public class ProcedureWithReturnValue implements Work {

    private final String parameter;
    private String returnValue = null;

    public ProcedureWithReturnValue (final String parameter) {
        this.parameter = parameter;
    }

    @Override
    public void execute(Connection connection) {
        CallableStatement statement = null;

        try {   
            statement = connection.prepareCall("begin ? := package.procedure(?); end;");
            statement.registerOutParameter(1, OracleTypes.VARCHAR);
            statement.setString(2, parameter);
            statement.execute();

            returnValue = statement.getString(1);
        } catch (SQLException e) {
            Logger.error("Error getting return value - catched error '%s'",  e);
        }
    }

    public String getReturnValue() {
        return returnValue;
    }
}
于 2013-03-06T11:40:55.173 に答える
0

ストアド プロシージャを作成するための進化 ( http://www.playframework.com/documentation/1.2.7/evolutions ) を参照してください。

于 2014-01-21T19:53:42.483 に答える