2016-12-19 9 views
-1

私はSQLでライブラリ管理システムを実装しています。 I次の表の構造とその中に挿入されたいくつかの値を持っている:なし未返却図書を持っていない私が今欲しい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'); 

は私のDBは、ユーザーのために、「借入」の本を許可するということである(すなわち借り表に挿入) (返された日付はnullではありません)、書籍が返却されていない場合は、すべての処理を中止します。私は次のようにこれを実装するために考えた:

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

また、1つのINSERT文、何IFは不要にあなたの手続きを簡素化することができます:それは明示的にINSERT文の列を一覧表示することも良いコーディングスタイルです

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; 

where句で暗黙的な結合を使用するのではなく、明示的なJOIN演算子に慣れる必要があります。

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

何1本について:あなたはあなたのパラメーターも、プロシージャ内で使用される列と同じ名前を付けるべきではありません

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; 
関連する問題