plsql结果由多行组成。如何汉德尔

时间:2016-10-09 06:05:28

标签: plsql

CREATE PROCEDURE book_check(book_Id varchar(64))
    begin 
    declare book_available varchar(64);

    select book_id into book_available 
    from book_copies 
    where No_of_Copies >0 and book_id=book_Id;

    if(book_Id in book_available ) then
        select concat ("Book available");
    else
        select concat ("Book not available");
    end if;
end
//

我能用什么来代替'in'。我知道错误的语法。

2 个答案:

答案 0 :(得分:1)

我不清楚你要做什么。我假设你想知道一本书是否可用,并将该信息返回给该函数的调用者。

您对过程标题和变量的声明是错误的。

  • 过程或函数参数未定义为数据类型的长度。
  • 在程序或功能中,您不需要declare
  • 如果不将结果放在某个位置,就不能有select语句。 *使用:=
  • 为变量分配常量值
  • 如果要将信息返回给调用者,请使用函数,而不是过程
  • 您不应该为变量或参数指定与列相同的名称。 Oracle世界中的一个常见命名约定是为参数提供前缀p_,将局部变量赋予前缀l_,但是任何可以避免列名和变量之间发生名称冲突的事情都可以 - 只需保持一致。
CREATE function book_check(p_book_id varchar)
   return varchar
as
   l_count integer;
   l_result varchar(20);
begin 
  select count(*)
    into l_count
  from book_copies 
  where No_of_Copies > 0 
    and book_id = p_book_id;

  if l_count > 0 then 
    l_result := 'Book available';
  else
    l_result := "Book not available";
  end if;

  return result;

end;
/

你应该花点时间阅读PL/SQL Language reference。所有上述内容都在那里解释。

答案 1 :(得分:1)

这很容易 - 尝试这样的事情:

create or replace function book_check(book_id varchar) return varchar as
begin 
    for r in (select 1 from book_copies where no_of_copies > 0 and book_id = book_check.book_id) loop
        return 'Book available';
    end loop;
    return 'Book not available';
end book_check;
/
相关问题