2010-12-29 3 views
0

저는 간단해야한다고 생각하는 작업을 담당하고 있지만, 전에는 해본 적이 없어서 문제가 있습니다. EclipseLink를 사용하여 EJB 3 프로젝트를 성공적으로 만들었습니다.이 프로젝트는 Oracle 데이터베이스에서 여러 저장 프로 시저를 호출합니다. 데이터 소스를 올바로 구성 했으므로 매개 변수없이 커서를 반환하는 간단한 저장 프로 시저 및 함수를 연결하고 실행할 수 있습니다. 그러나 현재 매개 변수가있는 저장 프로 시저를 실행할 수 없습니다.EclipseLink - 오라클 저장 프로 시저 호출 초보자 문제

EclipseLink 위키를 참조 번호 http://wiki.eclipse.org/Using_Basic_Query_API_(ELUG으로 사용하고 있습니다.

코드는 다음과 같습니다 나는 데이터베이스 자체에 액세스 할 수 없기 때문에

데이터베이스 문서를 기반으로
StoredProcedureCall call = new StoredProcedureCall(); 
call.setProcedureName("p_environment.startSession"); 

List<String[]> args = new ArrayList<String[]>(); 
args.add(new String[] { "user", "ae01403" }); 
args.add(new String[] { "application", "app_code" }); 
args.add(new String[] { "locale", "it_IT" }); 

for (String[] pair : args) { 
    call.addNamedArgumentValue(pair[0], pair[1]); 
} 

DataReadQuery query = new DataReadQuery(call); 
for (String[] pair : args) { 
    query.addArgument(pair[0]); 
} 

, 절차는 지정된 이름의 매개 변수 3 VARCHAR 걸립니다. 그런 다음 활성 세션에서 executeQuery 메서드를 호출하지만 "잘못된 형식 또는 인수 개수"오류가 발생합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 어떤 도움을 주셔서 감사합니다.

편집 : 저장 프로 시저 서명, 문서에 따라입니다 :

p_environment.startSession(as_user  IN VARCHAR2, 
          as_application IN VARCHAR2, 
          as_locale  IN VARCHAR2); 

많은 감사합니다!

+0

더 정확한 내 게시물을 편집 :

DataReadQuery query = new DataReadQuery(call); for (String[] pair : args) { query.addArgument(pair[0]); } 

그런 다음 호출하여 저장 프로 시저 :

call.addNamedArgument(procedureUserParameterName, "user", String.class); call.addNamedArgument(procedureUserParameterName, "application", String.class); call.addNamedArgument(procedureUserParameterName, "locale", String.class); 

당신이 계속 대답 :) – LaGrandMere

답변

0

코드에 call.addNamedArgumentValue(pair[0], pair[1]);이 이상하게 들립니다.

대신이 작업을 수행하지 않아도됩니까?

call.addNamedArgument(procedureParameterName, argumentFieldName, argumentType); 

이 매개 변수를 사용하면 저장 프로 시저 매개 변수와 사용할 args 간의 매핑을 사용할 수 있습니다.

예를 들어, 당신을 위해, 그것은 제공 :

Session session = jpaEntityManager.getActiveSession(); 
List args = new ArrayList(); 
args.add(“ae01403”); 
args.add(“app_code”); 
args.add(“it_IT”); 
List results = (List) session.executeQuery(query, args); 
+0

고마워,하지만 안돼, 행운을 빌어 요. 내가 생각하는 call.addNamedArgumentValue (pair [0], pair [1]); session.executeQuery()에 매개 변수로 인수 목록을 전달하고 매개 변수에 값을 바인딩하는 것과 동일한 작업을 수행합니다. 유형을 지정하지 않으면 String이 기본값으로 사용되며 프로 시저 매개 변수 이름과 인수 필드 이름에 동일한 이름을 사용하려고했습니다. 오류 및 생성 된 코드도 동일합니다 ... 나는 실망합니다. 저장 프로 시저 서명을 포함하도록 질문을 편집했습니다. – Alessandro