2016-10-09 4 views
0
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"の代わりに何が書けますか?私は構文が間違っていることを知っている。plsql結果は複数の行から構成されています。どうすればいいですか?

+0

? –

+0

プレーンな['select into'](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/selectinto_statement.htm)は単なる値です。ワンショットで複数の値を取得する場合は、配列を定義して['bulk collect'](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/tuning)を使用する必要があります。 htm#BABEIACI)節。明らかに存在チェックが必要な場合は、何もメモリに読み込まずに行うことができます。 –

答えて

0

あなたが何をしようとしているかわかりません。 I は、書籍が利用可能かどうかを調べ、その情報を関数の呼び出し元に返したいとします。

プロシージャヘッダーと変数の宣言が間違っています。

  • プロシージャパラメータまたは関数パラメータには、データ型の長さが定義されていません。
  • 不要な手順や機能の中でdeclare
  • selectステートメントをどこかに置くことはできません。あなたは、発信者に情報を返すようにしたい場合は*あなたが変数を与えるか、または列と同じ名前をパラメータべきではありません
  • ないプロシージャ、関数を使用し、変数に一定の値が:=
  • を使用して行われ割り当てます。 Oracleの世界でよく使われる命名規則は、接頭辞p_とローカル変数の接頭辞l_のパラメータを与えることですが、列名と変数の間の名前の衝突を避けるものはすべてOKです。
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 Language referenceをお読みください。上記はすべてここで説明されています。

0

それは簡単だ - このような何かを試してみてください。

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; 
/
正確に何をしようとする
関連する問題