在SELECT语句中需要一个INTO子句

时间:2014-10-29 10:32:34

标签: oracle plsql oracle11g oracle10g

对此有何帮助? 我想归还所有住在法国的人,然后将他们与居住在BELguim的人比较,如果他们有相同的名字或name_done显示结果

declare
  cursor c is select namer from poeple where city = 'France';
  c_res c%rowtype;
begin
  open c;
  loop
    fetch c into c_res;
    exit when c%notfound;
    select * from poeple tw where city = 'BELguim' AND (c_res.namer = tw.namer OR c_res.namer = tw.namer || ' _done' );
  end loop;
  close c;
end;

2 个答案:

答案 0 :(得分:1)

为什么要使用游标?您可以使用一个查询来编写此代码:

select pb.*
from poeple pf join
     poeple pb
     on pf.city = 'France' and pb.city = 'BELgium' and
        (pf.namer = pb.namer or pf.namer = pb.namer || ' _done');

您的代码存在的问题是PL / SQL不允许查询从代码块返回任何内容。您可以打印出结果,将值插入变量,或将它们放在另一个表中。但是,您不能只从查询中获得结果。

答案 1 :(得分:1)

问题在于:

  

从城市中选择*,其中city =' BELguim' AND(c_res.namer   = tw.namer OR c_res.namer = tw.namer || ' _done' );

您无法直接在SQL中撰写PL/SQL。 PL / SQL引擎需要INTO子句。

查看代码,您不需要cursor c。它可以用单个SQL编写。这让我想起了戈登的问题:

select pb.*
from poeple pf join
     poeple pb
     on pf.city = 'France' and pb.city = 'BELgium' and
        (pf.namer = pb.namer or pf.namer = pb.namer || ' _done');

如果你真的需要PL / SQL来解决一些你没有解释的问题,例如将结果集返回为REF CURSOR,那么OUT参数为REF CURSOR。但是,你需要解释这个要求。

如果您可以在SQL中执行某些操作,那么请不要使用PL / SQL。

编辑如果您的最终目标是更新,请在USING声明中将上述查询用作MERGE子句。