选择单个列值并将其存储在变量oracle sql中

时间:2012-03-29 22:41:02

标签: sql oracle

我想获取特定的列值a.id并将其存储到变量v_id中。然后使用此值传递给存储过程。

DECLARE v_id a.id%TYPE;
BEGIN
SELECT id  into v_id from a where a.name='test' and rownum <2 order by id desc;
Print v_id;
doSomething(v_id);
END;
/

我在Oracle SQL Developer中收到此错误:

  

错误报告:ORA-06550:第3行第7列:PLS-00103:遇到了   符号&#34; V_ID&#34;期待以下之一:

     

:=。 (@%;符号&#34;:=&#34;代替&#34; V_ID&#34;到   继续。   06550. 00000 - &#34;行%s,列%s:\ n%s&#34;   *原因:通常是PL / SQL编译错误。   *操作:

3 个答案:

答案 0 :(得分:10)

如果您想使用rownumorder by 将订单放在子查询中。没有其他方法可以保证您获得正确的值。

处理可能没有与您的查询匹配的id的可能性也是一种好习惯。我添加了一个额外的begin... end;块来处理这个问题。

declare
   v_id a.id%type;
begin

   begin
      select id into v_id 
        from ( select id
                 from a 
                 where name = 'test' 
                 order by id desc )
       where rownum < 2 
             ;
    exception when no_data_found then
      v_id := null;
    end;

   dbms_output.put_line(v_id);
   doSomething(v_id);

end;
/

正如@raukh所指出的那样(当我写这篇文章的时候!)问题是print,应该是dbms_output.put_line()

答案 1 :(得分:4)

此:

Print v_id;

无效。可能你的意思是:

dbms_output.put_line(v_id);

? (请注意,您可能需要运行

set serveroutput on;
预先

以使上述效果发生。)

答案 2 :(得分:2)

PRINT不是有效的PL / SQL命令,因此会产生问题。也许你想要

DECLARE 
  v_id a.id%TYPE;
BEGIN
  SELECT id  
    into v_id 
    from (SELECT id 
            FROM a 
           where a.name='test' 
           order by id desc)
    where rownum < 2;
  dbms_output.put_line( v_id );
  doSomething(v_id);
END;
/