W takim razie drugim najłatwiejszym rozwiązaniem jest wykorzystanie flagi:
https://stackoverflow.com/questions/10814111/how-to-check-if-cursor-returns-any-records-in-oracle (pierwsza odpowiedź)
Kursory/Wyjątki - problem
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
- Postów: 13042
1
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2384
0
Otwierasz kursor, ale w zasadzie nic na nim nie robisz. Brakuje Ci FETCH z kursora (pobrania danych z kursora...).
FETCH krusor INTO zmienne;
- Rejestracja: dni
- Ostatnio: dni
- Postów: 28
0
DECLARE
V_STANOWISKO EMPLOYEES.JOB_ID%TYPE:=UPPER('&NAZWA_STANOWISKA');
IS_FOUND_REC BOOLEAN:= FALSE;
CURSOR ZADANIE2 IS
SELECT LAST_NAME FROM EMPLOYEES
WHERE JOB_ID = V_STANOWISKO;
BEGIN
DBMS_OUTPUT.PUT_LINE('Pracownicy na stanowisku: ' || v_stanowisko);
FOR V_STANOWISKO IN ZADANIE2 LOOP
IS_FOUND_REC:=TRUE;
DBMS_OUTPUT.PUT_LINE(V_STANOWISKO.LAST_NAME );
END LOOP;
IF NOT IS_FOUND_REC THEN
raise_application_error(-20001,'Nie istnieje stanowisko o takiej nazwie');
END IF;
END;
Error report -
ORA-20001: Nie istnieje stanowisko o takiej nazwie
ORA-06512: przy linia 15
z flagą naprawdę pomogło i działa ale chciałbym się dowiedzieć czy w tym kodzie poprzednim mogę zastosować fetch nie naruszając pętli for????
DECLARE
V_STANOWISKO EMPLOYEES.JOB_ID%TYPE:=UPPER('&NAZWA_STANOWISKA');
CURSOR ZADANIE2 IS
SELECT LAST_NAME FROM EMPLOYEES
WHERE JOB_ID = V_STANOWISKO;
BEGIN
OPEN ZADANIE2;
IF ZADANIE2%NOTFOUND THEN
raise_application_error(-20001,'Nie istnieje stanowisko o takiej nazwie');
END IF;
DBMS_OUTPUT.PUT_LINE('Pracownicy na stanowisku: ' || v_stanowisko);
CLOSE ZADANIE2;
FOR V_STANOWISKO IN ZADANIE2 LOOP
DBMS_OUTPUT.PUT_LINE(V_STANOWISKO.LAST_NAME );
END LOOP;
END;