2014-10-21 4 views
0

Я не понимаю, почему это не работает.Select-statement: другой результат в прямом запросе и pl/sql

Есть две таблицы:

a) id | value b) id | value 
    ----------  ------------ 
    1 | 1   1 | Hello 
    2 | 2   2 | Bye 
    3 | 1 

Я делаю этот запрос, содержащий LEFT JOIN:

select b.value 
from a 
left join b on a.value = b.id 
where a.id = 2 

Результат является: 'До свидания'. Что правильно.

Но если я использую тот же оператор в пакете с PL/SQL он получает неверный результат:

select b.value into word 
from a 
left join b on a.value = b.id 
where a.id = 2 and rownum <= 1 

Результат является: слово = «Hello», который является неправильным.

+0

. rownum, если запрос возвращает только один результат? – Aramillo

+0

От того, что вы нам показываете, это кажется невозможным. Это одна и та же база данных? Нет других записей в таблицах? –

+0

Aramillo: Да, rownum не нужен. Без rownum он возвращает больше одного значения, что приводит к исключению. Поэтому я добавил rownum, чтобы получить хотя бы неправильный результат. – Lopo

ответ

0

Прежде всего, удалите «rownum < = 1». Если вам действительно нужно, попробуйте следующее:

select value 
into word 
    from (select b.value 
     from a 
     left join b on a.value = b.id 
     where a.id = 2) 
where rownum <= 1; 

Чтобы лучше понять, что происходит, попробуйте выполнить следующее:

with a as (select 1 id, 1 value from dual union all 
      select 2, 2 from dual union all 
      select 3, 1 from dual), 
    b as (select 1 id, 'Hello' value from dual union all 
      select 2, 'Bye' from dual) 
select a.id aid, a.value avalue, b.id bid, b.value bvalue, rownum 
    from a left join b on a.value = b.id; 

это:

with a as (select 1 id, 1 value from dual union all 
      select 2, 2 from dual union all 
      select 3, 1 from dual), 
    b as (select 1 id, 'Hello' value from dual union all 
      select 2, 'Bye' from dual) 
select a.id aid, a.value avalue, b.id bid, b.value bvalue, rownum 
    from a left join b on a.value = b.id 
where a.id = 2; 

это:

with a as (select 1 id, 1 value from dual union all 
      select 2, 2 from dual union all 
      select 3, 1 from dual), 
    b as (select 1 id, 'Hello' value from dual union all 
      select 2, 'Bye' from dual) 
select a.id aid, a.value avalue, b.id bid, b.value bvalue, rownum 
    from a left join b on a.value = b.id 
where rownum = 1; 

и это:

with a as (select 1 id, 1 value from dual union all 
      select 2, 2 from dual union all 
      select 3, 1 from dual), 
    b as (select 1 id, 'Hello' value from dual union all 
      select 2, 'Bye' from dual) 
select a.id aid, a.value avalue, b.id bid, b.value bvalue, rownum 
    from a left join b on a.value = b.id 
where a.id = 2 and rownum = 1; 

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

1

Вы получаете исключение без предложения ROWNUM внутри своей функции PL/SQL, тогда как при непосредственном запуске запроса вы получаете только один результат. Это явный индикатор того, что ваша процедура PL/SQL не использует те же таблицы, что и ваш adhoc-запрос.

Пожалуйста, проверьте:

  • вы запустите AdHoc запрос как тот же пользователь, который владеет/SQL пакет PL?
  • Используете ли вы префиксы схемы для своих имен таблиц в вашем пакете PL/SQL?
  • - это ваш пакет с использованием прав на вызов (т. Е. Он содержит AUTHID CURRENT_USER)? Если да, то почему?
0

Почему вы используете для привязки значение = id? его бит тревожного, неразумного. Кроме того, у вас есть «ограничение» между условием. Так что подумайте, вы говорите оракулу, чтобы сделать левое соединение по значению и id, и в том условии, что вы говорите, что вам нужна только первая строка, а это означает, что набор будет содержать только связанный с Hello элемент

Смежные вопросы