PL/SQL

leo_oracle

Mitglied
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
 

leo_oracle

Mitglied
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...

Top Contributor
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

Mitglied
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?
 

Neue Themen


Oben