Хранимая процедура, позволяющая пользователю предоставлять заемщику несколько книг

#sql #oracle #stored-procedures #plsql

#sql #Oracle #хранимые процедуры #plsql

Вопрос:

У меня много проблем, пытаясь решить эту проблему. По сути, я пытаюсь создать процедуру в Oracle SQL Developer, которая позволяет предоставлять заемщику две книги. Таблицы и значения настроены правильно. Я чувствую, что моя созданная процедура может быть довольно близкой (на правильном пути), но я путаюсь в синтаксисе, особенно с датами и при попытке вызвать процедуру.

В схеме есть несколько других связанных таблиц, но суть в том, что я пытаюсь вставить записи библиотеки / заемщика в таблицу с именем loan . Вставляемые значения: 2x isbn, branchid, cardno, dateout (при заимствовании книг) и datein (по умолчанию null, пока книги не будут возвращены). Это имена столбцов в таблице loan.

Это процедура, над которой я работал:

 create or replace procedure BorrowTwoBooks(
p_isbn in varchar2,
p_isbn2 in varchar2,
p_branchid in number,
p_cardno in number
)
is
pDate Date Default SysDate;
begin
    insert into loan values(p_isbn, p_branchid, p_cardno, pDate, null);
    insert into loan values(p_isbn2, p_branchid, p_cardno, pDate, null);
end BorrowTwoBooks;
  

и это пример того, как я попытался бы вызвать процедуру после ее создания:

 begin
BorrowTwoBooks(
'9-9996751-3-1','1','489',pDate);
'1-8744165-3-2','1','489',pDate);
end;
  

где я надеюсь, что синтаксис будет:

 begin
BorrowTwoBooks(
'[isbn1],'[branchid],[cardno],[dateout]);
'[isbn2],'[branchid],[cardno],[dateout]);
end;
  

Любая помощь будет с благодарностью принята. Это мой первый пост, заранее благодарю всех за помощь. 🙂

Ответ №1:

для вашей процедуры синтаксис будет:

 begin
BorrowTwoBooks([isbn1],[isbn2],[branchid],[cardno]);
end;
  

попробуйте вызвать:

 begin
BorrowTwoBooks('9-9996751-3-1','1-8744165-3-2','1','489');
end;
  

Ответ №2:

Yoc создал процедуру, которая принимает 4 параметра. Два из них являются ISBN книг, а два других являются общими для обеих книг, поэтому вызов должен выглядеть так:

 begin
BorrowTwoBooks(
'9-9996751-3-1','1-8744165-3-2',1,489);
end;
  

Также дата не является параметром функции. При вызове процедуры для него устанавливается значение sysdate.

Ответ №3:

Вы уже получили ответ относительно конкретного случая, но мне кажется, что вам нужна процедура, в которой в качестве параметра date по умолчанию используется sysdate, но при необходимости может быть указана другая дата.

Если это так, ваша процедура должна выглядеть следующим образом:

 create or replace procedure BorrowTwoBooks(
  p_isbn in varchar2,
  p_isbn2 in varchar2,
  p_branchid in number,
  p_cardno in number,
  p_date in date default sysdate)
is
begin
  insert into loan(isbn, branchid, cardno, dateout, datein)
  values(p_isbn, p_branchid, p_cardno, p_date, null);

  insert into loan(isbn, branchid, cardno, dateout, datein)
  values(p_isbn2, p_branchid, p_cardno, p_date, null);
end BorrowTwoBooks;
  

Вы можете вызвать ее, не указав дату:

 begin
  BorrowTwoBooks('9-9996751-3-1', '1-8744165-3-2', '1', '489');
end;
  

Или вы можете вызвать его с определенной датой:

 declare
  l_date date;
begin
  l_date := to_date('2016/10/05', 'yyyy/mm/dd');
  BorrowTwoBooks('9-9996751-3-1', '1-8744165-3-2', '1', '489', l_date);
end;
  

Существует другой способ вызова процедуры — путем указания имен параметров. Этот синтаксис может быть проще для понимания:

 begin
  BorrowTwoBooks(p_isbn     => '9-9996751-3-1',
                 p_isbn2    => '1-8744165-3-2',
                 p_branchid => '1',
                 p_cardno   => '489');
end;