Oracle Pl/SQL - bład

0

mam mały problem, kod poniżej który powinien działąć, wyrzuca bład, ktos może wie dlaczego ?

select jest ok wykonuje sie, problem jest pewnie z if-em , pewnie jakis blad skladni

BEGIN

SELECT * FROM(
SELECT ROWNUM,
  SKLA.KOD,
  OSZAK.IMIE ||' '|| T.NAZW as "OSOBA WYPOZYCZAJACA",
  SP_T.NUMER,
  DO.C_NAZWISKO,
  DO.IMIE_OSOBY ,
  POBR.DATA_WYPOZYCZENIA,
  POBR.DATA_ODDANIA
  
FROM POBR_KSIAZEK POBR

LEFT JOIN KSIAZKI_W_MAGAZYNIE KWMG
ON KWMG.KWMG_ID = POBR.KWMG_ID

LEFT JOIN KSIAZKI KS
ON KS.KSIAZK_ID = KWMG.KSIAZK_ID

LEFT JOIN DANE_OSOB DO
ON DO.OSOBA_ID     = KS.OSOBA_ID

LEFT JOIN SKLAD_KSIAZEK SA_SKKS
ON SA_SKKS.SKAKT_ID = KWMG.SKAKT_ID

LEFT JOIN OSOBY_MAGAZYNU AD_MG
ON AD_MG.AD_MG_ID = POBR.MG_ID_POBRANIE     

LEFT JOIN JEDNOSTKI_KSIAZEK JK
ON JK.KSIAZK_ID = KS.KSIAZK_ID) SQ;


IF SQ.C_KOD IS NULL
THEN (SELECT * FROM SQ WHERE TO_DATE(SQ.DATA_WYPOZYCZENIA, 'DD-MM-YYYY') LIKE '10-10-2010');       --'10-10-2015' BETWEEN TO_DATE(SQ.D_DATA_POBRANIA, 'DD-MM-YYYY') AND   TO_DATE(SQ.D_DATA_ZWROTU, 'DD-MM-YYYY')) ;
ELSE (SELECT * FROM SQ WHERE SQ.DATA_ODDANIA IS NULL);

END IF;

END;


0

Jeśli masz komunikat błędu to go załącz.

Podejrzewam że problemem jest to, że masz w pl/sql zapytania bez klauzuli INTO.

0

error:

0

dodałem into i nadal bład

0

INTO powinno być w najwyższym select w hierarii czyli:

SELECT * INTO :a,:b,:c,:d,:e,:f FROM(
SELECT ROWNUM, ...

Pierwszy błąd powodują nawiasy, w które zostały opakowane zapytania:

IF SQ.C_KOD IS NULL
THEN (SELECT * FROM SQ WHERE TO_DATE(SQ.DATA_WYPOZYCZENIA, 'DD-MM-YYYY') LIKE '10-10-2010');       --'10-10-2015' BETWEEN TO_DATE(SQ.D_DATA_POBRANIA, 'DD-MM-YYYY') AND   TO_DATE(SQ.D_DATA_ZWROTU, 'DD-MM-YYYY')) ;
ELSE (SELECT * FROM SQ WHERE SQ.DATA_ODDANIA IS NULL);
 
END IF;

Powinno być:

IF SQ.C_KOD IS NULL
THEN SELECT * INTO Zmienna1 FROM SQ WHERE TO_DATE(SQ.DATA_WYPOZYCZENIA, 'DD-MM-YYYY') LIKE '10-10-2010';       
ELSE SELECT * INTO Zmienna2 FROM SQ WHERE SQ.DATA_ODDANIA IS NULL;
END IF; 

Listę zmiennych musisz określić sam - tyle ile kryje się pod *.

0

Ok widzę kopiuj wklej się kłania bez zrozumienia jak to działa. Nie widzę warunku where, który jednoznacznie określiłby, że zapytanie zwróci 1 rekord. W takim wypadku przypisanie nawet

select ... into ...

zwróci Ci wyjątek TOO_MANY_ROWS

. Aby tego uniknąć możesz albo zabezpieczyć select robiąc<code class="plsql"> where id = :parametr

lub wrzucając całość w pętlę FOR

for rec in (select ... ) loop
  if rec.c_kod is null then 
    ...
end loop;

Kolejna sprawa jeśli robisz złączenie z wielu tabel i wyciągasz w zapytaniu różne kolumny to

SELECT * INTO Zmienna1

zadziała tylko jeśli zdefiniujesz sobie odpowiedni typ tej zmiennej (w przypadku gdy będzie dużo rekordów to musi być to typ tablicowy).
W zależności od wersji oracle możesz jeszcze użyć BULK COLLECT aby nieco przyspieszyć całość zapytania. Niestety nie wiedząc co tak naprawdę usiłujesz zrobić nic więcej nie pomogę.

0

Do pętli FOR już doszliśmy :) iteracja pierwszego selecta poszła wraz z outputem na konsolę.

Teraz próbuję dojść co autor chce osiągnąć w tym IF.

0

pisane z głowy ale powinno działać jeśli gdzieś jakieś literówki nie zrobiłem
https://4programmers.net/Pastebin/5747

1 użytkowników online, w tym zalogowanych: 0, gości: 1