2015-01-12 4 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.«

Я работаю в Eclipse. Нужно ли мне импортировать функции для использования dbms_random или я просто что-то пропустил? Любая помощь будет оценена по достоинству.

+2

Это выглядит хорошо, так что, может быть, вы потеряли эту проблему (как недостающий пробел или скобки) при изменении фамилии; можете ли вы опубликовать свой исходный запрос? Это не похоже на собственную ошибку Oracle, так что, возможно, у вас есть средний уровень, который не нравится синтаксису подзапроса? –

+0

Вы ждали результата? несколько раз для получения результатов требуется несколько минут при использовании 'ORDER BY dbms_random.value' – jfun

+0

Оператор синтаксически корректен. Поэтому я думаю, что это не Oracle, жалующийся на синтаксис, но некоторый уровень Java db ошибочно. –

ответ

0

Это не код ошибки Oracle DB (они начинают с ORA- или ERR- или TNS-). Это похоже на код ошибки Derby. Так вы использовали неправильный драйвер для доступа к базе данных oracle, или вы на самом деле имеете в виду JavaDB с «Oracle Database»? Я предполагаю, что синтаксис недействителен для Derby/JavaDB.

Согласно this answer, следующий синтаксис будет работать:

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

Yep. Я идиот. благодаря – henryr0923

1

Я не уверен, но заказываю dbms_random.value may не работает должным образом при использовании дополнительных слоев, например jdbc. Кроме того, когда вы заказываете на <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

Ни одна из них не будет работать правильно. Первый будет оценивать 'rownum' перед' order by' и, вероятно, каждый раз будет возвращать одинаковое значение. Второй будет работать немного лучше, но будет по-прежнему иметь тенденцию возвращать некоторые значения по сравнению с другими из-за того, как данные извлекаются псевдо-упорядоченными с помощью 'sample'. Хотя использование «образца» в сочетании с другим случайным упорядочением может значительно повысить производительность, поэтому стоит подумать об этой идее. –

+0

Я видел этот синтаксис раньше, но всякий раз, когда я выполняю его, он сообщает мне, что dbms_random.value не является столбцом в моей таблице. С помощью второго сценария, используя образец, я получаю аналогичную ошибку с моей исходной проблемой: ERROR 42X01: Синтаксическая ошибка: встречается «1» в строке 1, столбец 41. – henryr0923

+0

@JonHeller Оба варианта работают правильно, однако спасибо за комментарий, я отредактировал первый, теперь он 'заказывает' перед оценкой' rownum' – jfun

Смежные вопросы