2015-06-09 3 views
0

Я пытаюсь создать случайный ROWID для целей тестирования. Я знаю, что это не путь, но, поскольку у меня нет данных (пока), мне просто нужно гарантировать, что при вставке «значения» ROWID (с использованием функции ROWIDTOCHAR) у меня есть всякая строка каждый раз.Генерировать случайный ROWID

Я читал DBMS_ROWID из документации Oracle, и я нашел способ генерации ROWID для тестирования с использованием функции ROWID_CREATE.

DBMS_ROWID.ROWID_CREATE (
    rowid_type IN NUMBER, 
    object_number IN NUMBER, 
    relative_fno IN NUMBER, 
    block_number IN NUMBER, 
    row_number IN NUMBER) 
    RETURN ROWID; 

Мой вопрос: есть ли способ создать случайный ROWID с помощью этой функции? (Как случайной функции для генерации параметров в)

В соответствии с тем, что я прочитал в DBMS_RANDOM странице

  • DBMS_RANDOM.RANDOM производит целые числа в [-2 ^^ 31, 2 ^^ 31).
  • DBMS_RANDOM.VALUE производит номера в [0,1) с 38 цифрами точности.

И я не уверен, если сгенерированные значения всегда действительны быть в параметрах и генерировать ROWID. Мне просто нужен действительный ROWID, поэтому я могу использовать функцию ROWIDTOCHAR.

+0

Вы не можете создать «случайный ROWID» - ROWID - это физическое местоположение ** строки внутри табличного пространства. Что вы планируете делать со случайным местоположением, которое, вероятно, даже не указывает на допустимую строку? Или, может быть, в строку из другой таблицы? В чем именно заключается основная проблема, которую вы пытаетесь решить? –

+1

Не было бы проще получить реальный ROWID случайной строки из реальной таблицы (например, SYS.OBJ $, если у вас нет собственных данных все же)? (Сохранение ROWID кажется странным в любом случае; [но обычно безопасно] (https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:122614800346142639)) –

+0

У меня есть Тип и один из его атрибутов - rowid. Это значение rowid будет вставлено в таблицу. Мне просто нужно случайное значение ROWID, чтобы он мог «передать» функцию «ROWIDTOCHAR». Спасибо Алекс. Я попробую сделать это, сделаю это awnser, чтобы я мог его принять. Я знаю, что это странно, но я не тот, кто проектирует архитектуру: x – SaintLike

ответ

2

Вместо того, чтобы генерировать собственное случайное значение, которое может или не может указывать на реальный объект (но, вероятно, нет), вы можете получить реальный ROWID случайной строки из реальной таблицы. Если у вас нет собственных данных, вы можете использовать любую таблицу, которую вы можете увидеть; посмотрите в all_tables на самый высокий num_rows значение.

В качестве примера можно использовать SYS.OBJ$, если у вас есть запрос привилегии для, которые непосредственно:

select rowidtochar(min(rowid)) from SYS.OBJ$ sample(0.001); 

Отрегулируйте размер выборки, так что вы всегда получите некоторые данные, но как можно меньше; вы все равно получите несколько строк назад, поэтому min() выбирает один. Разумеется, каждый раз, конечно, не получается получать другое значение, но ни один из них не является dbms_random, и при достаточно большой таблице он должен быть достаточно хорошим.


Если у вас нет доступа к достаточно большой таблице, вы можете генерировать случайные значения, как вы описали:

select rowidtochar(dbms_rowid.rowid_create(
    rowid_type => 1, 
    object_number => ceil(dbms_random.value(0, 1023)), 
    relative_fno => ceil(dbms_random.value(0, 1023)), 
    block_number => ceil(dbms_random.value(0, 1023)), 
    row_number => ceil(dbms_random.value(0, 1023)))) 
from dual; 

Для каждого из целочисленных значений этого использует перегруженную dbms_random.value функции получить значение в диапазоне, а затем использовать ceil, чтобы сделать его целым числом. (Вы также можете обрезать, округлить или сбрасывать; ноль может быть не допустимым аргументом, поэтому вам может понадобиться диапазон значений, чтобы начать с одного вместо этого).

Как Дэвид Олдридж сказал, что будут ограничения на некоторые из этих аргументов (которые вы можете быть в состоянии вывести из documentation, но они не подтверждены за что и работает постоянно дает различные значения:

ROWIDTOCHAR(DBMS_R 
------------------ 
AAAAODADcAAAAOfABa 
AAAAHTADOAAAANaAEb 
AAAAI+ANtAAAAMuAKl 
AAAAOdAI2AAAAMiAJ4 
AAAADNAFAAAAAJRAIn 
1

Я думаю, что эта функция довольно тупая, поскольку она не собирается проверять, что определенный номер объекта существует как часть генерации ROWID. Тем не менее, это может быть неверно для rowid_type.

Конечно, на многих номерах будет верхняя граница, но вы можете сделать вывод из документации ROW ID, которая объясняет формат.

0

Я думаю, что это больше для администраторов баз данных. Например, когда вы сталкиваетесь с проблемами с повреждением файлов данных. Такие инструменты, как dbv или оператор alter database dump block, или различные базы данных аварийных дампов содержат адрес блока базы данных и другие номера, которые должны быть переданы этой функции. Таким образом, это можно использовать для определения конкретных данных в базе данных.

Эта функция не проверяет, действительно ли результирующее число адресатов является допустимой строкой в ​​определенном сегменте данных.

Если вы хотите увидеть некоторые использовать данные таблицы случайных sample clause:

select * from t sample(5);