2 Cursor in Oracle Datenbank verwenden?

Hallo, Aufgabenstellung ist es per SQL Prozedure in einer Oracle Datenbank die gesendeteten SMS pro Monat zu ermitteln. Übersteigt der Wert eine bestimmte Höhe, dann soll eine Strafe in einer Tabelle gespeichert werden. Vielen Dank im vorraus für alle Ratschläge.
Erhalte derzeit volgenden Fehler: FEHLER bei Zeile 38: PLS-00103: Fand das Symbol „end-of-file“ als eines der folgenden erwartet wurde:

end not pragma final instantiable order overriding static
member constructor map

Hier nun der Code:
CREATE OR REPLACE PROCEDURE TEVEELSMS
(NUMMER_IN IN NUMBER)
IS
C_NUMMER NUMBER, C_BOETE NUMBER, C_TEGOED NUMBER;

CURSOR C1 IS
SELECT COUNT(VERZENDERMOBIELNUMMER)
FROM SMSBERICHT
WHERE trunc(DATUMTIJD, ‚MM‘) = trunc(SYSDATE, ‚MM‘)
AND VERZENDERMOBIELNUMMER = NUMMER_IN
AND VERZENDERMOBIELNUMMER IN(
SELECT MOBIELNUMMER
FROM KLANT
WHERE ABONNEMENTSVORM LIKE ‚SMS Budget‘);

CURSOR C2 IS
SELECT BOETE, TEGOED
FROM SMSTARIEF
WHERE ID LIKE ‚SMS Budget‘;

BEGIN

OPEN C1;
FETCH C1 INTO C_NUMMER;

OPEN C2;
FETCH C2 INTO C_BOETE, C_TEGOED;

IF C_NUMMER = C_TEGOED THEN
INSERT INTO BOETE(DATUM, MOBIELNUMMER, KOSTEN)
VALUES (SYSDATE ,NUMMER_IN, C_BOETE);
END IF;

COMMIT;

CLOSE C1;
CLOSE C2;
END;

Hallo, worum handelt es sich hier? Ist das eine professionelle Aufgabe in einem Kundenprojekt, oder die Kopfgeburt irgend eines Dozenten an einer Lehranstalt?

Der Ansatz ist fragwürdig. PL/SQL wird hier allenfalls gebraucht, weil es eine Prozedur werden soll. Cursors muss man hier nicht verwenden, es sei denn, eine völlig praxisfremde Aufgabenstellung verlangt dies. Überdies bezweifle ich, dass Cursors richtig verstanden wurden?

Merke: ein Cursor, der immer nur genau einen Wert für einen „IF“ liefert, ist eine „WHERE“ Clause.

Gruß, Ulli.

Danke für die schnelle Antwort. Es hat sich ergeben, dass die Aufgabenstellung so gar nicht ausführbar ist. Allerdings hatte der Dozent auch keine Idee wie man diese Aufgabenstellung lösen kann. Der Einsatz von Cursor C1 kann sicherlich noch verbessert werden bzw. durch eine Variabel ersetzt werden, doch für die Lösung der Aufgabenstellung ist dies nicht weiter wichtig.

Die Prozedur funktioniert jetzt zwar ohne Fehler, aber kann nicht vom Trigger angerufen werden, da die Prozedur laut Aufgabenstellung die Tabelle durchsuchen soll, die den Trigger mit AFTER anruft.

CREATE OR REPLACE
PROCEDURE TEVEELSMS
(NUMMER_IN IN NUMBER)
IS
C_NUMMER NUMBER := 0; C_BOETE NUMBER := 0; C_TEGOED NUMBER := 0;

CURSOR C1 IS
SELECT COUNT(VERZENDERMOBIELNUMMER)
FROM SMSBERICHT
WHERE trunc(DATUMTIJD, ‚MM‘) = trunc(SYSDATE, ‚MM‘)
AND VERZENDERMOBIELNUMMER = NUMMER_IN
AND VERZENDERMOBIELNUMMER IN(
SELECT MOBIELNUMMER
FROM KLANT
WHERE ABONNEMENTSVORM LIKE ‚SMS Budget‘);

CURSOR C2 IS
SELECT BOETE, TEGOED
FROM SMSTARIEF
WHERE ID LIKE ‚SMS Budget‘;

BEGIN

OPEN C1;
FETCH C1 INTO C_NUMMER;

OPEN C2;
FETCH C2 INTO C_BOETE, C_TEGOED;

IF C_NUMMER = C_TEGOED THEN
INSERT INTO BOETE(DATUM, MOBIELNUMMER, KOSTEN)
VALUES (SYSDATE ,NUMMER_IN, C_BOETE);
END IF;

COMMIT;

CLOSE C1;
CLOSE C2;
END;

Würd mal so spontan sagen, dass Du da einfach noch nen einfach Schrägstrich (/) in die letzte Zeile packen musst. Kann auch sein, dass ein „end;“ funktioniert. Bin mir aber nicht 100% sicher, benutze dafür immer Tools…

Viele Grüße, Alex