2010-06-02 3 views
3

코드에서 자동 증가 필드를 관리해야합니다. 나는 이것을 위해 저장 프로 시저를 작성하기로 결정했다. 아이디어는 새로운 행을 삽입하고 자동으로 증가 된 값을 Java에 반환하는 프로 시저를 가지므로 더 이상 작업 할 수 있습니다. 다음은 내가 지금까지 가지고있는 것이다. 나는 그 모든 것을 가능하게하기 위해 공백을 채우기 위해 무엇을 바꾸어야할지 모른다.최대 절전 모드 저장 프로 시저 결과

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE addNewMSO 
    @sourceApplication char(8), 
    @selectionStatusDate datetime = NULL, 
    @sysLstUpdtUserId char(10) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    Declare @newVal int 
    SET @newVal = (select max(seqNo) from MemberSelectedOptions) + 1 

    INSERT INTO MemberSelectedOptions 
     ([SourceApplication] 
     ,[SeqNo] 
     ,[SelectionStatusDate] 
     ,[SysLstUpdtUserId]) 
VALUES 
     (@sourceApplication 
     ,@newVal 
     ,@selectionStatusDate 
     ,@sysLstUpdtUserId) 

END 
GO 

다음 Java 코드에서 다음과 같은 내용이 있습니다.

@NamedNativeQuery(name="addNewMSO", 
    query="exec addNewMSO :sourceApplication :selectionStatusDate :sysLstUpdtUserId", callable=true) 

그리고 내 DAO는 이런 식으로 호출 ... 나는 "순수 네이티브 스칼라 쿼리는 아직 지원되지 않습니다"오류가 원인

Query q = session.getNamedQuery("addNewMSO"); 
q.setParameter("sourceApplication", mso.getSourceApplication()); 
q.setParameter("selectionStatusDate", mso.getSelectionStatusDate()); 
q.setParameter("sysLstUpdtUserId", mso.getSysLstUpdtUserId()); 
q.executeUpdate(); 

은 그렇다하더라도,이 작동하지 않습니다. 그래서 나는 다음에 어디로 가야할지 모른다. 나는 Hibernate 문서를 읽었지만 SP에서 반환 값을 얻는 방법을 모른다. 그러나 나는 아직도 그것을 심지어 부르지 않을 수있다. .. 우!

TIA 모든 도움.

답변

4

SP에서 결과 집합을 반환하지 않으면 session.getConnection() 및 원시 JDBC를 사용해야 할 것입니다. 최대 절전 모드의 문서에 따르면

16.2.2. Using stored procedures for querying

Hibernate3는 저장 프로 시저를 통해 쿼리와 기능에 대한 지원을 제공합니다. 다음의 대부분은 설명서에 해당합니다. 저장 프로 시저/함수는 최대 절전 모드과 작동 할 수 있도록 첫 번째 out- 매개 변수로 결과 집합을 반환해야합니다. 일부 절차/기능 규칙을 준수하지 않는 와 (...)

16.2.2.1. Rules/limitations for using stored procedures

당신은 저장 사용할 수 없습니다 절차는 최대 절전 모드. 이러한 규칙을 따르지 않으면 최대 절전 모드에서 을 사용할 수 없습니다. 여전히 이 절차를 사용하려면 session.connection()을 통해 을 실행해야합니다. 각 데이터베이스에 대해 의 규칙이 다르다. 데이터베이스 벤더에는 프로 시저 의미/구문 이 다르기 때문에.

저장 프로 시저 쿼리는 setFirstResult()/setMaxResults()으로 호출 할 수 없습니다.

권장 전화 양식은 표준 SQL92 : 또는 { ? = call procedureName(<parameters>}입니다. 네이티브 호출 구문은 지원되지 않습니다.

(...)

는 사이베이스 또는 MS SQL 서버에 대해 다음과 같은 규칙이 적용됩니다

  • 절차는 결과 셋을 반환해야한다. 이들 서버는 복수 결과 ​​집합을 반환하고 개수를 업데이트 할 수 있기 때문에 최대 절전 모드는 결과를 반복하고 이 결과 집합을 반환 값으로 사용한다는 것을 알 수 있습니다. 그 외 모든 것은 삭제됩니다.
  • 프로 시저에서 SET NOCOUNT ON을 활성화하면 이 더 효율적일 수 있지만 요구 사항이 아닙니다.
0

면책 조항 : I 최대 절전 모드에 익숙 NO WAY에있어 없으며, 자바,하지만 난 당신이 적어도 하나의 결과 집합이 있어야하는 것 이상으로 읽은 것을에서 일을!? SQL-2005 태그가 있다고 가정 할 때 코드가 T-SQL에 있다고 가정하므로 코드가 그 점에서 '결함이 있음'을 지적하고자합니다. 그렇습니다 (예, 아주 작은 기회이지만 여전히) @newval을 선택한 순간과 실제 삽입을 수행하는 사이에 다른 연결이 새 레코드를 테이블에 삽입하는 경우가 발생합니다. 이것은 단순히 INSERT와 SELECT를 단일 문에 넣어서 잠금 또는 IMHO를 사용하여 해결할 수 있습니다. ISNULL()을 추가하면 빈 테이블을 사용하여 다시 시작해야하는 경우 추가 할 시작 값이 없더라도 저장 프로 시저가 예상대로 작동합니다.

CREATE PROCEDURE addNewMSO 
@sourceApplication char(8), 
@selectionStatusDate datetime = NULL, 
@sysLstUpdtUserId char(10) 
AS 
BEGIN 
SET NOCOUNT ON; 

INSERT INTO MemberSelectedOptions 
    ([SourceApplication] 
    ,[SeqNo] 
    ,[SelectionStatusDate] 
    ,[SysLstUpdtUserId]) 
OUTPUT (inserted.[SeqNo]) 
SELECT [SourceApplication] = @sourceApplication, 
    [SeqNo]    = ISNULL((SELECT max([SeqNo]) FROM MemberSelectedOptions), 0) + 1, 
    [SelectionStatusDate] = @selectionStatusDate, 
    [SysLstUpdtUserId] = @sysLstUpdtUserId 
END 

출력 절은 내가 제대로 최대 절전 모드의 한계를 이해한다면, 및을 무엇이 필요 을 지원 무슨 에 모두 당신을 도울하는 레코드에 새로 삽입 된 값을 반환합니다.