2015-01-12 3 views
1

저는 Oracle SQL에 대해 아직 상당히 익숙하지 만, 인터넷에서 임의로 테이블의 행을 가져 와서 이와 같은 코드를 볼 수 있습니다.DBMS_RANDOM이 작동하지 않는 것 같습니다.

firstNameGen = connection.prepareStatement(
    "SELECT firstName " 
     +"FROM (SELECT firstName " 
     +"FROM firstNames " 
     +"ORDER BY dbms_random.value) " 
    +"WHERE ROWNUM = 1"); 

나를 위해 작동하지 않습니다. 분명히, 나는 자신의 데이터베이스와 일치하도록 모든 컬럼과 테이블 이름을 변경했으나 "ERROR 42X01 : 구문 오류 :"WHERE "라인 1, 컬럼 58에서 발생했습니다."

나는 이클립스에서 일하고있다. dbms_random을 사용하기 위해 기능을 가져와야합니까, 아니면 그냥 누락 되었습니까? 어떤 도움을 주시면 감사하겠습니다.

+2

, 그래서 어쩌면 당신이 (누락 된 공간이나 괄호와 같은) 문제를 잃었다; 대신 원래 검색어를 게시 할 수 있습니까? 그건 네이티브 오라클 오류처럼 보이지 않습니다, 그래서 어쩌면 당신은 서브 쿼리 구문을 좋아하지 않는 중간 레이어가? –

+0

결과를 기다렸습니까? 'ORDER BY dbms_random.value'를 사용하면 결과를 얻기까지 몇 분이 걸릴 때가 있습니다. – jfun

+0

구문은 구문 상 올바로되어 있습니다. 그래서 나는 오라클이 구문에 대해 불평하지 않는 것 같지만, 일부 Java DB 레이어는 잘못 이해하고 있습니다. –

답변

0

이 오라클 DB 오류 코드 (그들은 ORA- 또는 ERR- 또는 TNS-로 시작)하지 않습니다. Derby 오류 코드처럼 보입니다. 그렇다면 잘못된 드라이버를 사용하여 oracle 데이터베이스에 액세스 했습니까? 아니면 실제로 "Oracle Database"로 JavaDB를 의미합니까? Derby/JavaDB에서는 구문이 유효하지 않다고 생각합니다.

this answer에 따르면, 다음 구문이 작동 것 : 이름을 변경하는 동안 잘 보이는

"SELECT firstName FROM firstNames ORDER BY RANDOM() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY" 
+0

그래. 나는 바보 야. 감사 – henryr0923

1

여분의 레이어 (예 : jdbc)를 사용하는 경우 dbms_random.value may이 제대로 작동하지 않습니다. 당신이 <expression returning a number>, it orders by the expression 아닌 "열"에 의해 주문하는 경우도 있지만 당신은 단지 하나의 값, 나는 두 가지 다른 방법 말할 수 있습니다 표시하려면 :

  1. 그냥 쿼리에 열로 dbms_random.value을 추가하고 그 순서대로.

    select * from (select 
        firstName 
        , dbms_random.value as ran 
    from firstNames 
    order by ran) 
    where rownum=1; 
    
  2. 사용 예제()

    select firstName 
    from firstNames sample (1) 
    where rownum =1; 
    
+1

두 가지 방법 중 하나를 올바르게 사용할 수 없습니다. 첫 번째 사용자는'order by '이전에'rownum '을 평가할 것이고 매회 동일한 값을 반환 할 것입니다. 두 번째 방법은 조금 더 잘 작동하지만 'sample'에 의해 의사 순서로 데이터가 검색되는 방식 때문에 다른 값보다 약간의 값을 반환하는 경향이 있습니다. '무작위 순서'와 함께 '샘플'을 사용하면 성능이 크게 향상 될 수 있으므로 고려할 가치가있는 아이디어입니다. –

+0

이전에이 구문을 보았지만 실행될 때마다 dbms_random.value가 테이블의 열이 아니라고 알려줍니다. 두 번째 스크립트를 사용하여 샘플을 사용하면 원래 문제와 비슷한 오류가 발생합니다. 오류 42X01 : 구문 오류 : 줄 1, 열 41에서 "1"이 발생했습니다. – henryr0923

+0

@JonHeller 두 가지 모두 올바르게 작동하지만 의견을 보내 주시면 첫 번째 것을 편집 했으니, 이제'rownum'을 평가하기 전에'order'라고 부릅니다 – jfun

관련 문제