2016-10-09 1 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 
// 

was kann ich anstelle von 'in' schreiben. Ich kenne die Syntax falsch.plsql Ergebnis bestand aus mehr als einer Zeile. Wie man es handhabt

+0

Was genau wollen Sie tun? –

+0

Die Ebene ['Auswählen in'] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/selectinto_statement.htm) ist nur für einen einzelnen Wert. Wenn Sie mehrere Werte auf einmal aufnehmen möchten, müssen Sie ein Array definieren und das ['bulk collect'] (http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/tuning) verwenden. htm # BABEIACI) -Klausel. Offensichtlich, wenn Sie wollen, ist eine Existenzprüfung, die Sie tun können, ohne irgendetwas in Gedächtnis zu lesen. –

Antwort

0

Es ist mir unklar, was Sie versuchen zu tun. I angenommen Sie möchten herausfinden, ob ein Buch verfügbar ist oder nicht und diese Informationen an den Aufrufer der Funktion zurückgeben.

Ihre Deklaration des Prozedurheaders und der Variablen ist falsch.

  • Prozedur- oder Funktionsparameter sind nicht mit einer Länge für den Datentyp definiert.
  • Innerhalb einer Prozedur oder Funktion, die Sie nicht declare brauchen
  • Sie das Ergebnis irgendwo ohne Einlochen select Aussage nicht haben kann. * Zuordnung zu einer Variablen einen konstanten Wert wird :=
  • fertig mit der Wenn Sie Informationen zum Anrufer zurückkehren möchten, verwenden Sie eine Funktion, kein Verfahren
  • Sie nicht den gleichen Namen wie eine Spalte Variablen oder Parameter geben sollte. Eine gängige Benennungskonvention in der Oracle-Welt besteht darin, Parametern das Präfix p_ und lokale Variablen das Präfix l_ zu geben, aber alles, was einen Namenskonflikt zwischen Spaltennamen und Variablen vermeidet, ist OK - sei nur konsistent.
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; 
/

Sie sollten sich wirklich die Zeit nehmen und die PL/SQL Language reference lesen. Alles oben wird dort erklärt.

0

Es ist einfach - versuchen, so etwas wie dieses:

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; 
/
Verwandte Themen