# PL/SQL



## leo_oracle (26. Feb 2012)

Hallo,
ich möchte die Tabelle ABFLUG mit Hilfe eines Cursors lesen und ermitteln für alle Tage zwischen dem 13.11.2001  und dem 17.11.2001, an denen mindestens ein Flug startet, die Anzahl der Vormittagsflüge = Abflug zwischen 8:00 und 12:00 Uhr) und der Nachmittagsflüge = Abflug zwischen 12:00 und 20:00 Uhr).
 Für null Flüge kommt diese Text raus: „ – keine Flüge –“:
 das Ergebnis soll wie folgt am Bildschirm ausgegeben werden: 
13.11.2001: Anzahl der Vormittags-Fluege:   1
13.11.2001: Anzahl der Nachmittags-Fluege:  1
14.11.2001: Anzahl der Vormittags-Fluege:   2
14.11.2001: Anzahl der Nachmittags-Fluege:   -keine Flüge-
... etc
Tabelle Abflug:
Datum             Zeit
13.11.2011       10h23
13.11.2011       16h55
14.11.2011       08h14
14.11.2011       08h17
15.11.2011       14h45
17.11.2011       08h11
17.11.2011       16h25

so habe ich versucht aber das war leider nicht richtig: 

SET SERVEROUTPUT ON              

DECLARE
vor CONSTANT VARCHAR2(30):='Anzahl der Vormittagsflüge';
nach CONSTANT VARCHAR2(30):='Anzahl der nachmittagsflüge';
c NUMBER;

CURSOR abflug_cursor IS
(select ab_datum,ab_zeit,count(ab_zeit) as count from abflug
where  ab_zeit < 12 
group by ab_datum,ab_zeit)
union all ( select ab_datum,ab_zeit,count(ab_zeit) as count from abflug
where  ab_zeit > 12
group by ab_datum,ab_zeit );
ab_datum abflug.ab_datum%TYPE;
ab_zeit abflug.ab_zeit%TYPE;

BEGIN
 IF NOT abflug_cursor%ISOPEN
 THEN
 OPEN abflug_cursor;
 END IF;

 SELECT count(ab_zeit) INTO c FROM abflug;
 LOOP

    FETCH abflug_cursor INTO ab_datum,ab_zeit,c;
    EXIT WHEN abflug_cursor%NOTFOUND ;

DBMS_OUTPUT.PUT_LINE('**************************');

IF ab_zeit between 8 and 12 THEN
DBMS_OUTPUT.PUT_LINE(ab_datum||vor||c);
ELSIF ab_zeit between 12 and 21 THEN
DBMS_OUTPUT.PUT_LINE(ab_datum||nach||c);
ELSE
DBMS_OUTPUT.PUT_LINE(ab_datum||'keine Flüge'||c);

END IF;
  END LOOP ;
 CLOSE abflug_cursor ; 
END;
/

Danke


----------



## Gast2 (27. Feb 2012)

leo_oracle hat gesagt.:


> so habe ich versucht aber das war leider nicht richtig:



Und was bekommst du raus wenn du deinen Block laufen lässt?

Wenn die Zeit in deiner Tabelle wirklich so aussieht "10h23" wird wohl ein < oder > 12 dir nicht weiterhelfen.


----------



## leo_oracle (27. Feb 2012)

fassy hat gesagt.:


> Und was bekommst du raus wenn du deinen Block laufen lässt?
> 
> Wenn die Zeit in deiner Tabelle wirklich so aussieht "10h23" wird wohl ein < oder > 12 dir nicht weiterhelfen.




danke für dein antwort
die zeit wird als float gespeichert also 10,23.
das ist meine ausgabe:

*****************************************
13.11.2001: Anzahl der Vormittags-Fluege1
*****************************************
13.11.2001: Anzahl der Nachmittags-Fluege1
*****************************************
14.11.2001: Anzahl der Vormittags-Fluege1
*****************************************
14.11.2001: Anzahl der Vormittags-Fluege1
*****************************************
15.11.2001: Anzahl der Nachmittags-Fluege1
*****************************************
17.11.2001: Anzahl der Vormittags-Fluege1
*****************************************
17.11.2001: Anzahl der Nachmittags-Fluege1
*****************************************

also am 14.11.2001 hat nicht die Vormittags zusammen gezählt und keine Meldung 'keine Flüge'
und am 15.11.2001 hat nicht die Meldung 'keine Flüge' ausgegeben.


gruss
leo


----------



## Michael... (27. Feb 2012)

gibt es überhaupt Einträge mit einer Uhrzeit vor 8 bzw. nach 21 Uhr? Wenn nein wird der else Fall nie eintreten, denn Einträge ohne Datum wird es vermutlich nicht geben. ==> Einfach mal den Inhalt des Cursors ausgeben lassen. Ich vermute, dass darin keine passenden Einträge erhalten sind, für die der Fall "keine Flüge" passen.
Warum überhaupt mittels Cursor, sowas könnte man doch direkt per SQL zusammensetzen.


----------



## leo_oracle (27. Feb 2012)

Michael... hat gesagt.:


> gibt es überhaupt Einträge mit einer Uhrzeit vor 8 bzw. nach 21 Uhr? Wenn nein wird der else Fall nie eintreten, denn Einträge ohne Datum wird es vermutlich nicht geben. ==> Einfach mal den Inhalt des Cursors ausgeben lassen. Ich vermute, dass darin keine passenden Einträge erhalten sind, für die der Fall "keine Flüge" passen.
> Warum überhaupt mittels Cursor, sowas könnte man doch direkt per SQL zusammensetzen.



und wie geht ohne cursor?


----------

