2016-08-03 11 views
0

Ich versuche, die folgenden zu tun, indem Sie einen Cursor durch den Nachnamen des MitarbeitersMit Cursor in einer Funktion zum Namen Ausgeben ändert

erstellen PLSQL Funktion ändern verwenden, die, wenn sie auf einer SQL-Anweisung ausgeben würde, die letzten Namen verwendet aller Mitarbeiter in der Tabelle Mitarbeiter nach folgenden Logik:

  • Wenn der Name des Mitarbeiters KING ist, sollte die Funktion Ausgabe als LION.
  • Wenn der Name des Mitarbeiters FORD ist, sollte die Funktion Ausgang als CAR
  • Wenn der Name des Mitarbeiters MILLER ist, dann ist die Funktion sollte es zu BEER ändern.

Andernfalls sollte der Name so ausgegeben werden, wie er in der Tabelle employees aufgeführt ist.

Bisher habe ich dies:

set serveroutput on; 
CREATE OR REPLACE FUNCTION changeName (lastname_in IN VARHCAR2) 

    RETURN c_emp_record 
    IS 
declare 

CURSOR c_emp_record IS 
    SELECT last_name FROM employees; 
    v_emp_record c_emp_record%ROWTYPE; 
begin 
OPEN c_emp_record; 
DBMS_OUTPUT.PUT_LINE('LastName'||' '); 
    LOOP 
    FETCH c_emp_record into v_emp_record; 
     EXIT WHEN c_emp_record%NOTFOUND; 
     if c_emp_record IN ('%KING%') THEN 
     DBMS_OUTPUT.PUT_LINE(' LION'); 
     elsif c_emp_record LIKE '%FORD%' THEN  
     DBMS_OUTPUT.PUT_LINE(' CAR'); 
     ELSIF c_emp_record LIKE '%MILLER%' THEN  
     DBMS_OUTPUT.PUT_LINE('BEER'); 
     ELSE 
     DBMS_OUTPUT.PUT_LINE(v_emp_record.last_name || 'No change'); 
    END IF; 
    END LOOP; 

    end changeName; 

Ich bin nicht sicher, ob ich den Cursor für dieses Problem richtig

Antwort

0

Versuchen Sie dieses verwende. Auch hier war kein Cursor erforderlich. Da Sie last_name übergeben, wird die Funktion sowieso einen einzelnen Wert zurückgeben.

CREATE OR REPLACE FUNCTION changeName (lastname_in IN VARCHAR2) 
    RETURN varchar2 
IS 

    CURSOR c_emp_record IS 
    SELECT emp_name 
    FROM employee 
    where emp_name = lastname_in ; 

    v_emp_record employee.emp_name%TYPE; 

Begin 
OPEN c_emp_record; 

DBMS_OUTPUT.PUT_LINE('LastName'||' '); 
    LOOP 
    FETCH c_emp_record into v_emp_record; 
     EXIT WHEN c_emp_record%NOTFOUND; 

     if v_emp_record LIKE '%KING%' THEN 
     v_emp_record:='LION'; 
     DBMS_OUTPUT.PUT_LINE(v_emp_record) ; 

     Elsif v_emp_record LIKE '%FORD%' THEN 
     v_emp_record := 'CAR'; 
     DBMS_OUTPUT.PUT_LINE(v_emp_record) ; 

     ELSIF v_emp_record LIKE '%MILLER%' THEN 
     v_emp_record := 'BEER'; 
     DBMS_OUTPUT.PUT_LINE(v_emp_record) ;  

     END IF; 
    END LOOP; 

Close c_emp_record ; 
return (v_emp_record); 

End changeName; 
1

Da die Zuordnung Anrufe für eine Funktion, die vermutlich erwartet er dies einen ref Cursor zurückzukehren, in welchem ​​Fall es entlang der Linien von (ungetestet) sein:

create or replace function newname 
    (lastname_in in employees.name%type) 
    return sys_refcursor 
as 
    c_results sys_refcursor; 
begin 
    open c_results for 
     select first_name 
      , last_name 
      , case last_name 
        when 'KING' then 'LION' 
        when 'FORD' then 'CAR' 
        when 'MILLER' then 'BEER' 
        else last_name 
       end as new_name 
     from employees 
     where last_name = lastname_in 
     order by last_name, first_name; 

    return c_results; 
end newname; 

Wenn eine Prozedur ist, akzeptabel und „Ausgang“ bedeuten dbms_output kann (in der Regel ein Diagnose/Debugging-Tool und nicht geeignet für die Produktion Berichterstattung), können Sie so etwas wie dieses (nicht getestet) versuchen könnte:

create or replace procedure newname 
    (lastname_in in employees.name%type) 
as 
begin 
    for r in (
     select last_name 
      , case last_name 
        when 'KING' then 'LION' 
        when 'FORD' then 'CAR' 
        when 'MILLER' then 'BEER' 
        else last_name 
       end as new_name 
     from employees 
     where last_name = lastname_in 
     order by last_name, first_name 
    ) 
    loop 
     dbms_output.put_line(r.new_name); 
    end loop; 

end newname; 

ich weiß nicht, was cou Sie nehmen, aber ich frage mich, warum alle Anfänger scheinen für die meisten gefalteten Cursor-Konstruktionen möglich (deklarieren Sie den Cursor, öffnen, Schleife, holen, beenden, wenn usw.). Der Standard for r in (...) loop Aufbau ist alles, was Sie in den meisten Fällen benötigen (das ist, wenn Sie überhaupt eine Schleife benötigen) und ist in der Regel schneller.

Auch es lohnt sich, sich angewöhnen, Ihren Code obsessiv, mit der konsequenten Verwendung von Groß-/Kleinbuchstaben und einem Standard-Einzug (Ich habe 4 Leerzeichen verwendet, und ich verwende nie Großbuchstaben).

Verwandte Themen