Select语句:直接查询和pl / sql中的结果不同

时间:2014-10-21 13:48:02

标签: sql oracle plsql

我不知道为什么这不起作用。

有两个表:

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

我正在进行包含左连接的查询:

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

结果是:word =&#39;你好&#39;这是不正确的。

3 个答案:

答案 0 :(得分:1)

在PL / SQL函数中没有ROWNUM子句会出现异常,而在直接运行查询时只得到一个结果。这清楚地表明您的PL / SQL程序没有使用与您的adhoc查询相同的表格。

请检查:

  • 您是否以拥有PL / SQL包的同一用户身份运行您的adhoc查询?
  • 您是否在PL / SQL包中使用模式前缀作为表名?
  • 是您使用调用者权限的包(即它是否包含AUTHID CURRENT_USER)?如果是,为什么?

答案 1 :(得分:0)

首先,删除&#34; rownum&lt; = 1&#34;条件。 如果你真的需要它,试试这个:

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的行为。

答案 2 :(得分:0)

为什么使用绑定值= id?它有点令人不安,没关系。此外,条件之间还有一个rownum“约束”。所以考虑一下,你是说oracle要对值和id进行左连接,并且在条件中你说你只需要第一行,这意味着该set只包含Hello“相关”元素