Я пытаюсь отладить кусок кода, который предложил ChatGPT, но не уверен, возможно ли это вообще. Я получаю ошибку о том, что данные не найдены, при выполнении следующего запроса:
SELECT CASE
WHEN v_column_no = 1 THEN LASTNAMES1
WHEN v_column_no = 2 THEN LASTNAMES2
WHEN v_column_no = 3 THEN LASTNAMES3
WHEN v_column_no = 4 THEN LASTNAMES4
WHEN v_column_no = 5 THEN LASTNAMES5
WHEN v_column_no = 6 THEN LASTNAMES6
END
INTO v_last_name
FROM EXTERNAL_LAST_NAMES_ALL
WHERE LASTNAME_ID = TRUNC(DBMS_RANDOM.VALUE(1,5171));
Я ожидал получить одно случайное значение из одного случайного столбца (в таблице 5170 строк). Но я получаю ошибку.
Существует ли элегантное решение для случайного выбора столбца в PL/SQL?
Ответ
Конечно! Давайте разберемся с вашей задачей и решим проблему с выбором случайного значения из случайного столбца в PL/SQL.
Ошибка "no data found" может происходить по нескольким причинам. Возможно, указанный идентификатор LASTNAME_ID не существует в вашей таблице, или запрос не возвращает значений, которые вы ожидаете. Однако, чтобы элегантно выбрать случайный столбец и затем случайное значение из него, мы можем использовать следующий подход:
- Сначала получим случайное значение LASTNAME_ID.
- Затем на основе этого идентификатора выберем значение из одного из случайных столбцов.
Вот как можно переписать ваш код:
DECLARE
v_last_name VARCHAR2(100);
v_column_no INTEGER := TRUNC(DBMS_RANDOM.VALUE(1, 7)); -- 1-6 для 6 столбцов
v_lastname_id INTEGER;
BEGIN
-- Получаем случайный LASTNAME_ID
SELECT LASTNAME_ID
INTO v_lastname_id
FROM (SELECT LASTNAME_ID FROM EXTERNAL_LAST_NAMES_ALL ORDER BY DBMS_RANDOM.VALUE)
WHERE ROWNUM = 1;
-- Получаем случайное значение из случайного столбца
SELECT CASE
WHEN v_column_no = 1 THEN LASTNAMES1
WHEN v_column_no = 2 THEN LASTNAMES2
WHEN v_column_no = 3 THEN LASTNAMES3
WHEN v_column_no = 4 THEN LASTNAMES4
WHEN v_column_no = 5 THEN LASTNAMES5
WHEN v_column_no = 6 THEN LASTNAMES6
END
INTO v_last_name
FROM EXTERNAL_LAST_NAMES_ALL
WHERE LASTNAME_ID = v_lastname_id;
-- Выводим результат (например, через DBMS_OUTPUT)
DBMS_OUTPUT.PUT_LINE('Случайная фамилия: ' || v_last_name);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Данные не найдены.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Произошла ошибка: ' || SQLERRM);
END;
В этом коде:
- Мы сначала выбираем случайный LASTNAME_ID из таблицы.
- Затем используем его, чтобы извлечь значение из одного из шести столбцов, выбранного случайно.
- Мы также добавили обработку исключений, чтобы вывести подходящие сообщения в случае ошибок.
Обязательно убедитесь, что в вашей таблице EXTERNAL_LAST_NAMES_ALL есть данные и что LASTNAME_ID действительно существует в этой таблице. Если у вас появятся дополнительные вопросы или возникнут проблемы, не стесняйтесь спрашивать!