Результат plsql состоял из более чем одной строки. Как это сделать

#plsql

#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’ . Я знаю синтаксис, который я ошибаюсь.

Комментарии:

1. Что именно вы пытаетесь сделать?

2. Равнина select into предназначена только для одного значения. Если вы хотите захватить несколько значений за один снимок, вам нужно будет определить массив и использовать bulk collect предложение. Очевидно, что если вы хотите проверить наличие, вы можете сделать это, не считывая ничего в память.

Ответ №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;
/
  

Ответ №2:

Мне непонятно, что вы пытаетесь сделать. Я предполагаю, что вы хотите узнать, доступна ли книга или нет, и вернуть эту информацию вызывающей функции.

Ваше объявление заголовка процедуры и переменных неверно.

  • Параметры процедуры или функции не определены с длиной для типа данных.
  • Внутри процедуры или функции, которые вам не нужны 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. Там объясняется все вышесказанное.