2011-01-18 4 views
6

안녕하세요 모든 매개 변수는 OUT 매개 변수입니다 Oracle 저장 프로 시저를최대 절전 모드로 저장 프로 시저를 호출하는 방법은 무엇입니까?

GET_VENDOR_STATUS_COUNT(DOCUMENT_ID IN NUMBER , NOT_INVITED OUT NUMBER,INVITE_WITHDRAWN OUT NUMBER,... 

휴식을해야합니다. 내가 쓴 HBM 파일에서

- 자바에서

<sql-query name="getVendorStatus" callable="true"> 
    <return-scalar column="NOT_INVITED" type="string"/> 
    <return-scalar column="INVITE_WITHDRAWN" type="string"/> 
    <return-scalar column="INVITED" type="string"/> 
    <return-scalar column="DISQUALIFIED" type="string"/> 
    <return-scalar column="RESPONSE_AWAITED" type="string"/> 
    <return-scalar column="RESPONSE_IN_PROGRESS" type="string"/> 
    <return-scalar column="RESPONSE_RECEIVED" type="string"/> 
    { call GET_VENDOR_STATUS_COUNT(:DOCUMENT_ID , :NOT_INVITED ,:INVITE_WITHDRAWN ,:INVITED ,:DISQUALIFIED ,:RESPONSE_AWAITED ,:RESPONSE_IN_PROGRESS ,:RESPONSE_RECEIVED) } 
    </sql-query> 

은 내가 쓴 -

session.getNamedQuery("getVendorStatus").setParameter("DOCUMENT_ID", "DOCUMENT_ID").setParameter("NOT_INVITED", "NOT_INVITED") 

는 ... 모든 parametes 때까지 계속한다.

나는

 
    18:29:33,056 WARN [JDBCExceptionReporter] SQL Error: 1006, SQLState: 72000 
    18:29:33,056 ERROR [JDBCExceptionReporter] ORA-01006: bind variable does not exist 

나 최대 절전 모드에서 저장 프로 시저를 호출의 정확한 과정이 무엇인지 알려 주시기 바랍니다는 SQL 예외를 얻고있다. 나는 JDBC 호출 문을 사용하고 싶지 않다.

+0

저장 프로 시저 및 제한 사용에 대한 [official doc] (http://docs.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5/html/Hibernate_Core_Reference_Guide/sp_query.html)을 참조하십시오 (http : //docs.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5/html/Hibernate_Core_Reference_Guide/sp_query.html) –

답변

1

Hibernate를 사용하면 결과 클래스를 적용하여 SP 결과를 변환해야하며 반환되는 열의 이름은 결과 클래스의 올바른 반환 필드에 별칭이 지정되어야합니다. Hibernate는 SQLServer에 저장된 procs가 단일 반환 결과를 가지기를 원하고 어떤 종류의 Object를 생성할지 알고 싶어합니다. 제가 작동하는 곳에서는 일반적으로 return_code와 message라는 두 행의 단일 행 결과를 반환합니다.

  • return_code = 404

    , 메시지가 "페이지를 찾을 수 없습니다"= 예

    ...

  • return_code = 200 메시지 = "OK"

클래스 다른 POJO와 마찬가지로 매핑되므로 Serializeable로 설정해야합니다. 예를 들어 :

@Entity 
public class StoredProc implements Serializable { 

    private Integer returnCode; 
    private String message; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "return_code", nullable = false, unique = true) 
    public Integer getReturnCode() { 
    return returnCode; 
    } 
    public void setReturnCode(Integer returnCode) { 
    this.returnCode = returnCode; 
    } 

    @Column(name = "message") 
    public String getMessage() { 
    return message; 
    } 
    public void setMessage(String message) { 
    this.message = message; 
    } 

} 

는 또한 최대 절전 모드가 사용하는 이름 지정 규칙과 관련하여 몇 가지 일반적인 hokeyness을 불러올 것으로 보인다. names_with_underscores가 camelCaseFieldNames로 변환 된 것 같습니다.

5

(INOUT/OUT 매개 변수 처리 중) 시도는 4.1에서 지원되지 않습니다. 4.1을 통해 Hibernate의 callable statement 지원은 ResultSet 리턴에 중점을 둔다. 업스트림 마스터에서 이미 시도하고있는 것에 대한 지원이 있으며 Hibernate의 다음 주요 릴리스 (4.2 또는 5.0 중 하나임)의 일부가 될 것입니다. 호출 함수/프로 시저가 이제는 일급 연산이되었습니다.

당분간 JDBC를 직접 사용하거나 마스터에서 최대 절전 모드를 구축하고 새로운 지원을 사용해야합니다. 나중에 선택하면 다음과 같이 표시됩니다.

StoredProcedureCall call = session.createStoredProcedureCall("GET_VENDOR_STATUS_COUNT") 
     .registerStoredProcedureParameter("DOCUMENT_ID", Long.class, ParameterMode.IN) 
     .registerStoredProcedureParameter("NOT_INVITED", String.class, ParameterMode.OUT) 
     ...; 
call.getRegisteredParameter("DOCUMENT_ID").bindValue(theDocumentId); 
StoredProcedureOutputs outputs = call.getOutputs(); 
String notInvited = (String) outputs.getOutputParameterValue("NOT_INVITED"); 
... 

코드가 아직 젊어서 변경 될 가능성이 있습니다.예를 들어, 나는이 예제를 더 자주 쓰면서, registerStoredProcedureParameterregisterParameter 또는 declareParameter으로 이름을 바꾸고 선언/등록의 형식화 된 표현을 반환해야한다고 생각합니다. 뭔가 같은 :

interface RegisteredParameter<T> { 
    Class<T> getParameterType(); 
    // only valid for IN or INOUT params 
    void bindValue(T value); 
} 

<T> RegisteredParameter<T> registerParameter(String name, Class<T> type, ParameterMode mode); 

다음 허용 것이다 : 추가 보너스로

StoredProcedureCall call = session.createStoredProcedureCall("GET_VENDOR_STATUS_COUNT") 
call.registerParameter("DOCUMENT_ID", Long.class, ParameterMode.IN).bindValue(theDocumentId); 
RegisteredParameter<String> notInvitedParam = call.registerParameter("NOT_INVITED", String.class, ParameterMode.OUT); 
... 
String notInvited = outputs.getOutputParameterValue(notInvitedParam); 

, 사람들은 일찍이있는을 가리 (그 이전에 출시 된 모양을 모양 도움을 받기를 시도 변경하기가 훨씬 더 어렵습니다.)

+0

현재 INOUT/OUT 매개 변수 처리가 지원되지 않는다는 것을 분명히해야합니다. 실제로 INOUT/OUT 매개 변수를 가질 수 있으며 ResultSets 만 반환하면 하나의 매개 변수 만 호출 당 결과를 반환 할 수 있습니다. –

+0

답변에 제공된 정보를 주셔서 감사합니다. 위에서 언급 한 기능이 최신 동면 버전 (4.3.6)에서 사용 가능합니다. 저장 프로 시저가 하나의 결과 집합을 반환 할 때 완벽하게 작동하지만 여러 결과 집합에 문제가있는 경우 위의 기능 문서에 대한 URL을 지적하십시오. 나는 Google에서 찾을 수 없습니다. –

관련 문제