Выбор случайного столбца в PL/SQL

Вопросы и ответы

Я пытаюсь отладить кусок кода, который предложил 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 не существует в вашей таблице, или запрос не возвращает значений, которые вы ожидаете. Однако, чтобы элегантно выбрать случайный столбец и затем случайное значение из него, мы можем использовать следующий подход:

  1. Сначала получим случайное значение LASTNAME_ID.
  2. Затем на основе этого идентификатора выберем значение из одного из случайных столбцов.

Вот как можно переписать ваш код:

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 действительно существует в этой таблице. Если у вас появятся дополнительные вопросы или возникнут проблемы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...