2016-05-08 9 views
-1
ACCEPT p_1 PROMPT 'Please enter the last name:' 
DECLARE 
v_last_name VARCHAR2(20) := '&p_1'; 
v_Hire_date person.hire_date%TYPE; 
v_Job_type person.job_type%TYPE; 
v_Job_status person.Job_status%TYPE; 
v_pilot_type pilot.pilot_type%TYPE; 
v_n number; 
BEGIN 
select count(*) into v_n from person 
where UPPER(last_name) = v_last_name; 
IF v_n != 1 THEN 
DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_last_name) || ' is not in the table. '); 
--ELSE 
select UPPER(e.last_name),e.hire_date,e.job_type,e.job_status, 
p.pilot_type into v_last_name,v_hire_date,v_Job_type,v_Job_status,v_pilot_type 
from person e JOIN pilot p 
ON (e.person_id = p.person_id) 
order by last_name; 
DBMS_OUTPUT.PUT_LINE(RPAD('last_name',10) || RPAD('hire_date',10) || 
RPAD('Job_type', 30) || RPAD('Job_status',10) || RPAD('pilot_type', 20)); 
ELSE 
    DBMS_OUTPUT.PUT_LINE('No output!'); 
END IF; 
END; 

Ich habe diesen Code geschrieben, um die Mitarbeiterinformationen anzuzeigen. Das Problem liegt im IF-Zustand. Es zeigt nicht das Ergebnis an.pl/sql Block zur Anzeige von Mitarbeiterinformationen

ERGEBNIS: Wenn ich die Benutzereingabe Nachname als braun eingeben es nur zeigt dies, wie unten

braun ist nicht in der Tabelle.

+0

Die unmittelbare Ursache ist, weil Sie das 'else' auskommentiert haben. Aber wie MTO zeigt, sollten Sie "if/else" nicht dafür verwenden. Gehen Sie einfach davon aus, dass Sie Ergebnisse erhalten und behandeln Sie die Ausnahme, wenn Sie dies nicht tun. – EdStevens

Antwort

0
SET SERVEROUTPUT ON; 

ACCEPT p_1 PROMPT 'Please enter the last name:' 
DECLARE 
    v_last_name person.last_name%TYPE := UPPER('&&p_1'); 
    v_Hire_date person.hire_date%TYPE; 
    v_Job_type person.job_type%TYPE; 
    v_Job_status person.Job_status%TYPE; 
    v_pilot_type pilot.pilot_type%TYPE; 
BEGIN 
    select e.hire_date, 
     e.job_type, 
     e.job_status, 
     p.pilot_type 
    into v_hire_date, 
     v_Job_type, 
     v_Job_status, 
     v_pilot_type 
    from person e 
     JOIN pilot p 
     ON (e.person_id = p.person_id) 
    WHERE UPPER(e.last_name) = v_last_name; 

    DBMS_OUTPUT.PUT_LINE(
    RPAD(v_last_name,10) 
    || RPAD(v_hire_date,10) 
    || RPAD(v_Job_type, 30) 
    || RPAD(v_Job_status,10) 
    || RPAD(v_pilot_type, 20) 
); 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    DBMS_OUTPUT.PUT_LINE(v_last_name || ' is not in the table. '); 
    WHEN TOO_MANY_ROWS THEN 
    DBMS_OUTPUT.PUT_LINE('No output!'); 
END; 
/
+0

Danke für die Antwort, aber ich kann immer noch nur einen Datensatz sehen. Ich muss den Namen aller Mitarbeiter anzeigen. – Kusuma

+0

Wechseln Sie dann von "INTO" zu "BULK COLLECT INTO" und verwenden Sie Sammlungen für die Variablen, dann können Sie eine 'FOR ... LOOP' verwenden, um alle Rückgabewerte zu durchlaufen. Oder Sie können Cursor verwenden und die Cursorzeilen überlappen. – MT0

+0

danke ich habe es verstanden. Können Sie mir sagen, wie Sie DECODE für Job_Type verwenden? Jobtyp als zwei FT und PT Ich möchte FT als Fulltime und PT als Teilzeit – Kusuma

1

„Wenn ich die Benutzereingabe Nachname als braun eingeben“

Ihre Frage ist etwas zweideutig, aber wenn Sie die Eingabe tatsächlich den Namen in Kleinbuchstaben (wörtlich als braun), dann ist das Problem zu diagnostizieren einfach:

Ihre WHERE-Klausel die Spalte Wert in Großbuchstaben wirft aber nicht den Eingang:

where UPPER(last_name) = v_last_name 

Dies entspricht upper('brown') = 'brown', which will never be true,because 'BROWN' <> 'braun'`.

Also, entweder nach einer genauen Übereinstimmung entscheiden oder den Fall Umstellung auf beiden Seiten gelten:

where UPPER(last_name) = upper(v_last_name) 

Alternativ haben Sie vielleicht mehr als eine Person namens Brown? Das würde auch die No-Record-Nachricht anzeigen, was falsch wäre.

+0

Dank für die Antwort machen. – Kusuma

Verwandte Themen