2013-05-16 5 views
1
나는 준비된 명령문에 넣어

내 질문은 : 나는 내 응용 프로그램에서 쿼리를 실행하면ORA-00907 내 자바 응용 프로그램에서 quering하지만 SQL Developer에서 잘 작동 할 때

select * 
    from (select seq, audit_ts, message_type 
      from log2 
      where 1 = 1 
      and message_type in ('SOURCE', 'DEST') 
      order by seq desc) 
where ROWNUM <= ? 

, 내가 얻을 :

java.sql.SQLSyntaxErrorException : ORA-00907 : 누락 오른쪽 괄호

EDIT : 여기 자바 execut 인 질의. 검색 결과 집합을 반환하려고하므로 접두사에 SELECT 문이 포함 된 다음 사용자 검색에 따라 매개 변수가있는 WHERE 절인 접미사 ("AUDIT_LOG_SEARCH2"에서 일부)를 가질 수 있습니다.

StringBuffer query = new StringBuffer(300); 
query.append(dbAdapter.getQuery("AUDIT_LOG_ENTRY_PREFIX")); 
query.append(dbAdapter.getQuery("AUDIT_LOG_SEARCH2")); 

// Insert parameters to complete the sql prepared statement 
PreparedStatement ps = _dbConn.prepareStatement(query.toString()); 
ResultSet rs = ps.executeQuery(); 

그러나 SQL Developer에서 별도로 실행할 때 쿼리가 올바르게 실행됩니다. 쿼리는 원래 Postgres 용으로 작성된 다음 Oracle 용으로 업데이트되었습니다. 어떤 팁?

+0

이들 중 어떤 것도 관련이 있다고 생각하지 마십시오 :'seq'와'seq_num' 다른 열; 바인드 변수에 대해 어떤 값을 설정하고 있습니까? 어떻게'execute' 또는'executeQuery'를 실행하고 있습니까? 이 문제를 해결하기 위해 Java 코드를 표시하는 것이 도움이 될 수 있습니다. –

+0

그건 완벽하게 좋은 오라클입니다. 아마도 문제는 자바 코드에 있습니다. 검색어 작성 방법을 게시 할 수 있습니까? 나는 그것이 잠재적 조건의 무리라고 가정하고있다. ('WHERE 1 = 1'은 비슷한 상황에서 내가 한 일이다.) 너무 많지 않으면 전체 덩어리를 게시 할 수 있는가? –

+0

쿼리를 빌드하는 로직이'getQuery' 메소드에있는 것처럼 보입니다. 그것을 추적하기보다는'query.append (dbAdapter.getQuery ("AUDIT_LOG_SEARCH2"))'문장 다음에'query.toString()'의 값을 인쇄하거나 로깅 할 수 있습니까?그런 다음 자신이 생각하는 것임을 확인하십시오. –

답변

0

@AlexPoole 및 @EdGibbs 주석에 따르면, 나는 더 많은 디버그 문을 추가하기로 결정했습니다. 특정 조건이 충족되면 나중에 프로그램에서 다른 SQL "접미사"를 사용하여 재귀 적으로 호출되는 메서드가 나타납니다. 명령문을 래핑하는 새로운 ROWNUM에 대한 접미어가 필요한 괄호로 업데이트되지 않았습니다. 따라서 ORA-00907이 여러 가지 형식 문제에 대해 던져 질 수는 있지만 실제로 문제를 일으키는 오른쪽 괄호였습니다 : P

SQL 쿼리를 작성하기 위해 접두사와 접미어가이 코드베이스에서 이상한 패턴으로 보입니다 . 나는 이것과 리팩토링을 없앰으로써 쿼리가 그렇게 구축 될 필요가 없다고 생각하고있다. 어떤 충고??

그렇다면이 Oracle 오류가 발생하는 모든 사용자는 SQL Developer에서 생성 및 재생중인 SQL 문을 기록하는 것이 좋습니다. 거기에서 작동하지만 응용 프로그램에서는 작동하지 않는다면, 코드는 아마도 펑키 한 일을하고있을 것입니다 : P

0

실행하기 전에 preparedStatement에 변수를 설정해야합니다.

PreparedStatement ps = _dbConn.prepareStatement(query.toString()); 
ps.setInt(1, 10); 

는 문제가 해결되지 않을 경우 query.toString() 당신을 제공 무엇을 게시하시기 바랍니다. 아니 query하지만 query.toString()

당신은 무엇을하고 :

// Insert parameters to complete the sql prepared statement 

가 올바르게 방법 ps.setString... 또는 무엇이든을 사용하고 있습니까? 아니면 물음표를 대체하고 있습니까? 두 번째 쿼리가 손상되었을 수 있습니다.

+0

코드에''// 매개 변수를 삽입하여 SQL 준비된 명령문을 완료하십시오. ''라는 메시지가 표시됩니다.이 명령문은 매개 변수가없는 쿼리에서 발생한다고 설명하고 있습니다. 어쨌든이 오류는 발생하지 않습니다. –

+0

@AlexPoole 내 의견이 잘못 될 때까지 대답을 삭제하는 것이 좋지 않습니다. – Roger

+0

나는이 시점에서 나쁜 아이디어가 있는지 확신하지 못한다 ... * 8-) –