Почему я получаю «Данные не найдены» при передаче строковой переменной в PL / SQL, где предложение - PullRequest
2 голосов
/ 20 апреля 2011

Я пытаюсь получить идентификационный номер пользователя на основе его идентификатора сети, но по какой-то причине, когда я пытаюсь передать его идентификатор сети в предложении WHERE оператора SELECT в этом PL / SQL I получить ошибку.

Однако, если я вывожу то, что в user_rec.USER_NAME, на консоль, будет допустимое значение, и если я жестко закодирую строку ex: WHERE UserID = 'USERNAME', она также будет работать как ожидалось. Кажется, что он не работает только для строковых переменных в предложении WHERE .....?

ORA-01403: no data found
ORA-06512 at line 12
01403.00000 - "no data found"
*Cause
*Action
Error at line 1

PL / SQL:

DECLARE
   v_addressbooknum number;
   v_addresstype nchar(3);
CURSOR SELECT_PORTALUSERS is
SELECT USER_NAME FROM PERSONS WHERE DEFAULT_GROUP <> 'Employees';
BEGIN
  FOR user_rec IN SELECT_PORTALUSERS LOOP
    -- Fetch Address Book # based on user ID
    SELECT ABNum INTO v_addressbooknum
    FROM OWNER.TABLE@DBLINK
    WHERE UserID = user_rec.USER_NAME;
  END LOOP;
END;

=============================================== ====================== EDIT

Вот новый PL / SQL, который я запустил на основе предложения DCookie

DECLARE
   v_addressbooknum number;
   v_addresstype nchar(3);
CURSOR SELECT_PORTALUSERS is
SELECT USER_NAME FROM PERSONS WHERE DEFAULT_GROUP <> 'Employees';
BEGIN
  FOR user_rec IN SELECT_PORTALUSERS LOOP

    -- DEBUG --
    DBMS_OUTPUT.PUT_LINE('DEBUG Found User: ' || user_rec.USER_NAME);
    -- END DEBUG --
    BEGIN
        -- Fetch Address Book # based on user ID
        SELECT ABNum INTO v_addressbooknum
        FROM OWNER.TABLE@DBLINK
        WHERE UserID = user_rec.USER_NAME;
    EXCEPTION
        WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('User: '||user_rec.USER_NAME);
    END;
  END LOOP;
  -- DEBUG --
  DBMS_OUTPUT.PUT_LINE('DONE');
  -- END DEBUG --
END;

А вот вывод, который я получаю, вы можете увидеть, находит ли значения в user_rec.user_name. И если я жестко закодировал один из идентификаторов пользователей, найденных в предложении where, он работает должным образом (то есть идентификаторы пользователей существуют в таблице, для которой выполняется выборка).

DEBUG Found User: USER846
User: USER846
DEBUG Found User: USER241
User: USER241
DEBUG Found User: USER780
User: USER780
DEBUG Found User: USER783
User: USER783
DEBUG Found User: USER294
User: USER294
DONE

Ответы [ 4 ]

3 голосов
/ 20 апреля 2011

Если ваш цикл FOR когда-либо выберет имя пользователя, которого нет в удаленной таблице (например, в удаленном столбце есть завершающие пробелы), вы получите эту ошибку, потому что вы не обрабатываете никаких исключений в операторе select.Я бы отладил это, добавив обработчик исключений и записав отладочную информацию:

BEGIN
  FOR user_rec IN SELECT_PORTALUSERS LOOP
    -- Fetch Address Book # based on user ID
    BEGIN
    SELECT ABNum INTO v_addressbooknum
    FROM OWNER.TABLE@DBLINK
    WHERE UserID = user_rec.USER_NAME; -- TRIM column or variable if necessary
    EXCEPTION
      WHEN OTHERS THEN
         DBMS_OUTPUT.PUT_LINE('User: '||user_rec.user_name);
    END;
  END LOOP;
END;
2 голосов
/ 20 апреля 2011

Просто кажется, что не все пользователи, которые находятся в PERSONS, также находятся в v_addressbooknum.

Попробуйте следующий sql, чтобы найти всех пользователей, которые существуют в PERSONS, но не в v_addressbooknum

SELECT USER_NAME FROM PERSONS
MINUS
SELECT userID FROM v_addressbooknum
;

Затем используйте

Exception
  When NO_DATA_FOUND Then
    DBMS_OUTPUT.PUT_LINE('no data found');
End;

для обработки этого состояния ошибки.

Не используйте «когда другие» для обработки «данные не найдены».

0 голосов
/ 20 апреля 2011

не могли бы вы поставить определение таблицы и пару строк?

я думаю, что

SELECT ABNum INTO v_addressbooknum
        FROM OWNER.TABLE@DBLINK
        WHERE UserID = user_rec.USER_NAME;

столбец UserId из таблицы @ dblink не совпадает с столбцом user_rec.USER_NAME;

в коде, который вы опубликовали, выбор идет с исключением с no_data_found в каждой строке

0 голосов
/ 20 апреля 2011

Похоже, это была проблема с форматированием данных, я TRIM редактировал и столбец, и переменную в предложении WHERE, и похоже, что он правильно возвращает данные ... Странно, поскольку они оба VARCHAR s

DECLARE
   v_addressbooknum number;
   v_addresstype nchar(3);
CURSOR SELECT_PORTALUSERS is
SELECT USER_NAME FROM PERSONS WHERE DEFAULT_GROUP <> 'Employees';
BEGIN
  FOR user_rec IN SELECT_PORTALUSERS LOOP

    BEGIN
        -- Fetch Address Book # based on user ID
        SELECT ABNum INTO v_addressbooknum
        FROM OWNER.TABLE@DBLINK
        WHERE TRRIM(UserID) = TRIM(user_rec.USER_NAME);
    EXCEPTION
        WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('User: '||user_rec.USER_NAME);
    END;
  END LOOP;

END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...