2016-12-19 3 views
-1

Я реализую систему управления библиотекой в ​​SQL. У меня есть следующие структуры таблицы и некоторые значения вставляются в них:SQL: Хранимая процедура

create table books 
(
IdBook number(5), 
NameBook varchar2(35), 
primary key(IdBook) 
); 

create table users 
(
IdUsers number(5), 
NameUser varchar2(20), 
primary key(IdUsers) 
); 

create table borrowed 
(
IdBorrowed number(5), 
IdUsers number(5), 
IdBook number(5), 
DueDate date, 
DateReturned date, 
constraint fk_borrowed foreign key(IdUsers) references users(IdUsers), 
constraint fk_borrowed2 foreign key(IdBook) references books(IdBook) 
); 

insert into books values(0,'FairyTale'); 
insert into books values(1,'Crime and Punishment'); 
insert into books values(2,'Anna Karenina'); 
insert into books values(3,'Norwegian Wood'); 

insert into users values(01,'Robb Dora'); 
insert into users values(02,'Pop Alina'); 
insert into users values(03,'Grozavescu Teodor'); 
insert into users values(04,'Popa Alin'); 

insert into borrowed values(10,02,3,'22-Jan-2017',null); 
insert into borrowed values(11,01,1,'25-Jan-2017','19-Dec-2016'); 
insert into borrowed values(12,01,3,'22-Jan-2017',null); 
insert into borrowed values(13,04,2,'22-Jan-2017','13-Dec-2016'); 

То, что я хочу сейчас, что мой дб, чтобы «заимствования» книг для пользователей (т.е. вставить в заимствованных таблицу), которые не имеют невозвращенные книги (т. е. возвращенная дата не равна нулю), и если у них есть невозвращенные книги, я хочу отказаться от всего процесса. Я думал, что осуществить это следующим образом:

create or replace procedure borrowBook(IdBorrowed in number,IdUsers number,IdBook number,DueDate date,DateReturned date) as begin 
if exists (SELECT u.IdUsers, u.NameUser, b.DateReturned 
     FROM users u, borrowed b 
     WHERE u.IDUSERS = b.IdUsers and DateReturned is not null), 
insert into borrowed values(IdBorrowed,IdUsers,IdBook,DueDate,DateReturned); 
end borrowBook; 

выше процедура не проверяет, если параметр Перехожу к этой функции такой же, как тот, в мой выбор, и я не знаю, как это сделать и правильно вставьте значение в мою таблицу.

Любая помощь будет высоко оценена. Заранее спасибо!

ответ

1

Вы не должны назвать свои параметры так же, как и столбцов, используемых внутри процедуры.

Вы можете также упростить процедуру одной инструкции INSERT, не IF не требуется:

create or replace procedure borrowBook(p_idborrowed in number, p_idusers number, p_idbook number, p_duedate date, p_datereturned date) 
as 
begin 

    insert into borrowed (idborrowed, idusers, idbook, duedate, datereturned) 
    select p_idborrowed, p_idusers, p_idbook, p_duedate, p_datereturned 
    from dual 
    where not exists (select * 
        from users u 
         join borrowed b on u.idusers = b.idusers 
        and b.datereturned is not null); 

end borrowBook; 

Это также хороший стиль кодирования явно перечислить столбцы для INSERT заявления. И вы должны привыкнуть к явному оператору JOIN вместо использования неявных объединений в предложении where.

0

Вы, казалось бы хотели что-то вроде этого:

create or replace procedure borrowBook (
    in_IdBorrowed in number, 
    in_IdUsers number, 
    in_IdBook number, 
    in_DueDate date, 
    in_DateReturned date 
) as 
    v_flag number; 
begin 
    select (case when exists (select 1 
           from borrowed b 
           where b.IdUsers = in_IdUsers and b.DateReturned is not null 
          ) 
       then 1 else 0 
      end) 
    into v_flag 
    from dual; 

    if (flag = 0) then 
     insert into borrowed  
      values(in_IdBorrowed, in_IdUsers, in_IdBook, in_DueDate, v_DateReturned); 
    end if 
end -- borrowBook; 
+0

Если я пытаюсь запустить это, я получаю следующие ошибки: Ошибка (10,5): PL/SQL: заявление SQL игнорируется Ошибка (12,49): PL/SQL: ORA-00904: «IN_IDUSER»: недействительный идентификатор Ошибка (20,9): PL/SQL: заявление SQL игнорируется Ошибка (21,70): PL/SQL: ORA-00984: здесь не разрешена колонка – didi

+0

@didi. , , Это называется «опечаткой». –

0

Что об этом один:

create or replace procedure borrowBook(p_IdBorrowed in number , 
             p_IdUsers  number , 
             p_IdBook   number , 
             p_DueDate  date  , 
             p_DateReturned date  ) 
as 
begin 
    if (SELECT COUNT(*) 
      FROM borrowed 
     WHERE IDUSERS = p_IdUsers 
      AND DateReturned IS NULL) = 0 THEN 

     insert into borrowed values (p_IdBorrowed , 
            p_IdUsers  , 
            p_IdBook  , 
            p_DueDate  , 
            p_DateReturned ); 
    end if ; 
end borrowBook; 
Смежные вопросы