Курсор Oracle возвращает все строки в таблице, несмотря на предложение where - PullRequest
0 голосов
/ 07 февраля 2012

Я использую следующий запрос для возврата одного значения:

select er.elig_code
from idm_elig_rule er 
where ER.ROLE_CODE = role_code and ER.SERVICE_CODE = service_code; 

Когда я подставляю значения для переменных и запускаю их как один оператор SQL, он вернет только одно значение, как я хочутоже.Однако, когда я помещаю оператор в курсор и перебираю результаты, он возвращает все строки в таблице.Я также попробовал оператор "select into", но он все равно возвращает все 85 строк в таблице.У меня есть уникальный индекс в таблице idm_elig_rule, который представляет собой комбинацию role_code, service_code и другого столбца.

РЕДАКТИРОВАТЬ: Вот как я тестирую это - используя анонимный блок:

declare
    role_code_in IDM_ELIG_RULE.ROLE_CODE%type := 'CEMP';
    service_code_in IDM_ELIG_RULE.SERVICE_CODE%type := 'PORTL'; 
    cursor get_elig_code is 
        select ER.ELIG_CODE
        from idm_elig_rule er 
        where ER.ROLE_CODE = role_code_in and ER.SERVICE_CODE = service_code_in; 
begin 
    for r in get_elig_code 
    loop
        DBMS_OUTPUT.PUT_LINE(r.elig_code);
    end loop;  
end;

РЕДАКТИРОВАТЬ: я изменил имена переменных в предложении where, и это решило проблему.

Ответы [ 3 ]

9 голосов
/ 07 февраля 2012

У вас проблема разрешения имен с именами переменных, поскольку имена переменных связывания совпадают с именами столбцов. Измените имена переменных, чтобы компилятор PL / SQL не принял решение за вас.

Разрешение имен переменных Oracle PL / SQL

3 голосов
/ 07 февраля 2012

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

select er.elig_code
  from idm_elig_rule er
 where ER.ROLE_CODE = role_code 
   and ER.SERVICE_CODE = service_code; 

Где БД видит role_code и service_codeкак столбцы, а не переменные, так что он всегда будет возвращать все строки из вашей таблицы.

Измените имена ваших переменных на что-то отличное от имен столбцов, чтобы увидеть, так ли это.

3 голосов
/ 07 февраля 2012

Поскольку ваши имена переменных совпадают с именами столбцов, возможно, что анализатор видит их как имена столбцов, а не как переменные, и, следовательно, вы получаете все строки, в которых столбцы равны друг другу, что будет исключать только строки со значениями NULL.

Я бы предложил всегда использовать разные имена для ваших переменных, чем для столбцов, чтобы избежать путаницы. Общепринятым методом является использование некоторого префикса в имени переменной, например l_ для локальной переменной, p_ для параметров или g_ для глобальных переменных.

В этом случае может быть лучше параметризовать курсор:

CURSOR code_cur (p_role_code INTEGER, p_service_code INTEGER) IS
select er.elig_code
from idm_elig_rule er 
where ER.ROLE_CODE = p_role_code and ER.SERVICE_CODE = p_service_code;

Тогда вы будете передавать значения при открытии курсора, например ::

FOR code_rec IN code_cur ( my_role_code_value, my_service_code_value ) LOOP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...