#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;