2013-03-06 2 views
4

Play Framework 1.2.5를 사용하고 있으며 저장 프로 시저를 만들고 사용하는 방법으로 SQL 쿼리를 최적화하고 싶지만 수행 방법을 모르겠습니다.Play Framework 및 JPA를 사용하여 저장 프로 시저 만들기 및 사용

Java 코드를 통해 저장 프로 시저를 만들려면 어떻게해야합니까? 또한 @OnApplicationStart 작업에서이 작업을 수행해야 응용 프로그램이 시작될 때 프로 시저가 만들어지고 저장됩니다.

후에 저장 프로 시저를 어떻게 사용할 수 있습니까? 어떤 기능을 사용합니까? 프로 시저에 매개 변수를 전달하려면 어떻게합니까? 절차 결과를 어떻게 검색 할 수 있습니까? (일반적으로 결과는 SELECT 쿼리가 될 것입니다.) 마지막으로, 내 프로 시저의 결과를 play 프레임 워크의 모델에 바인딩 할 수 있습니까?

당신의 도움이

답변

4

I 주셔서 감사합니다 내가 올바르게 사용하고 있는지 확인하고 싶습니다 나는 많은 질문을 가지고 있지만 나는 플레이 프레임 워크와 JPA 내가 저장 프로 시저에 새로운 해요 어떻게 작성해야할지 모르겠다. 아마도 OnApplicationStart 메서드가 필요할 것입니다. 내 환경에서는 절차가 이미 마련되어 있습니다. Play를 사용하여 호출합니다. 저장 프로 시저를 호출하려면 Work 인터페이스를 살펴 봐야합니다. 이를 구현하면 데이터베이스에서 명령문을 실행할 수 있습니다. 이 클래스를 확장 super()를 통해 생성자에 이름과 매개 변수를 전달할 수 있습니다 각각의 특정 저장 프로 시저를 들어

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); 
       } 
      } 
     } 
    } 
} 

:

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

을에서

우리는 기본 OracleProcedure 클래스를 만들었습니다 코드를 다음과 같이 호출 할 수 있습니다.

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

당신은 execute() 방법에 CallableStatement을 사용할 수있는 프로 시저를 호출하고 반환 값을 검색해야하는 경우 :

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; 
    } 
} 
+0

감사합니다. 그리고 프로 시저에서 SELECT 쿼리의 결과를 어떻게 검색 할 수 있는지 알고 있습니까? –

+0

값을 반환하는 다른 예제를 추가했습니다. 그게 당신이 의미 한 바 였으면 좋겠어요. – evandongen

+0

이 답변을 제공해 주셔서 감사합니다. 예제가 여러 결과를 반환하는 SELECT로 작동합니까? –

1

당신의 질문 중 하나에 대답하려면 :

당신은에 직접 저장 프로 시저를 작성해야합니다 데이타베이스에는 응용 프로그램과 실제로 연결되어 있지 않습니다. 데이터베이스에있을 때 응용 프로그램에서 호출 할 수 있습니다. 저장 프로 시저를 만드는 방법은 사용중인 데이터베이스에 따라 다릅니다.

시작하여 요구 사항 중 하나에 대한 저장 프로 시저를 만들고 올바르게 작동하는지 확인하십시오. 그런 다음 다음 단계로 진행하여 응용 프로그램에서 호출하십시오.

+0

정보를 제공해 주셔서 감사합니다. –

0

저장 프로 시저를 만들기위한 evolutions (http://www.playframework.com/documentation/1.2.7/evolutions)을 살펴보십시오.

+1

링크 전용 답변은 전혀 답변이 아닙니다. 링크가 오래되었습니다.답안에 내용을 포함 시키십시오. –

+1

다른 사이트 Okum의 전체 내용을 복사하거나 붙여 넣지 않을 것입니다. 나는 "진화"에 대한 언급이 파비안에게 충분하다고 생각한다. 이것을 구현하려면 두 줄 이상의 주석이 필요합니다. – GStyler77