Bernard Kowalski

Bernard Kowalski specjalista, The
Swatch Group Polska

Temat: PL-SQL

Witam,
czy istnieje możliwość pobierania danych z dwóch różnych cursorów w pl-sqlu?

Po otwarciu dwóch różnych cursorów , dane zarówno z jednego jak też drugiego cursora się pobierają.
Największy problem w tym, żeby jakoś połączyć te dane, żeby np dane dla daty z pierwszego cursora odpowiadały danej dacie w drugim cursorze.
chciałem osiąągnść coś takiego;
Data(1 cursor) | id_klienta (1 cursor) | nazwa_klienta (2 cursor)

chodzi o to żeby jakimś warunkiem spowodować prawidłowe przyporządkowanie nazw klientów (z 2 cursora) do Id_klienta z 1 cursora

Proszę o pomoc w temacie, z góry dzięki
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: PL-SQL

Jeżeli cursor_2 nie posiada id_klienta to sie nie da.
Jak wyglądają tabele które chcesz łączyć?
Marcin N.

Marcin N. Expert, Santander
Consumer Bank S.A.

Temat: PL-SQL

Witam,

jeżeli nie da się napisać tego w postaci zwykłego sql łączącego 2 tabele, to się nie da. Ale jak sądzę, to nie byłby problem, bo to oczywistość - zatem zakładam, że tabele da się połączyć jakimś polem. Jeśli nie wchodzi w grę połączenie tych 2 tabel jakimś joinem i konieczne są 2 kursory, to też się da.
Bernard Kowalski

Bernard Kowalski specjalista, The
Swatch Group Polska

Temat: PL-SQL

Marcin M.:
Jeżeli cursor_2 nie posiada id_klienta to sie nie da.
Jak wyglądają tabele które chcesz łączyć?

Tzn dokładnie chodzi o daty.
W pierwszym cursorze jest kolumna zawierająca daty, kolumna ilości zamówień itd

zapytanie zwraca pewien zakres dat i ilość zamówień dla każdej z nich, (group by data);

Drugi cursor zawiera:
Data | ilość zrealizowanych zamówień

chciałbym żeby wynik tego był taki;

Data (cur_1) | ilości zamówień (cur_1) | ilość zrealizowanych zamówień (cur_2)

na chwilę obecną oczywiście pokazuje rawidłowe dane z 1 cursora natomiast dane z drugiego nie są spójne z datą.

Chodzi o to żeby napisać warunek ze jeżeli w wyniku zpytania cursora 2 napotka datę (sysdate-1) to niech zwraca ilość zrealizowanych zamówień dla tej daty.
Bernard Kowalski

Bernard Kowalski specjalista, The
Swatch Group Polska

Temat: PL-SQL

Marcin N.:
Witam,

jeżeli nie da się napisać tego w postaci zwykłego sql łączącego 2 tabele, to się nie da. Ale jak sądzę, to nie byłby problem, bo to oczywistość - zatem zakładam, że tabele da się połączyć jakimś polem. Jeśli nie wchodzi w grę połączenie tych 2 tabel jakimś joinem i konieczne są 2 kursory, to też się da.


Witam,
Oczywiście da się połączyć natomiast problemem jest ciężkość tego zapytania. (wywala się)
kombinowałem w ten sposób żeby rozbić to na dwa cursory i na koniec pobierać odpowiednie dane.
Bernard Kowalski

Bernard Kowalski specjalista, The
Swatch Group Polska

Temat: PL-SQL

Panowie, mam jeszcze jedno pytanie, mianowicie
po zamknięciu pierwszego cursora otworzyłem drugi i pobieram dane teraz z drugiego.
dlaczego pamięta ostatni wiersz z pierwszego cursora i nadpisuje go jako pierwszy podczas pobierania danyc z drugiego cursora?

konto usunięte

Temat: PL-SQL

Bernard K.:
Marcin N.:
Witam,

jeżeli nie da się napisać tego w postaci zwykłego sql łączącego 2 tabele, to się nie da. Ale jak sądzę, to nie byłby problem, bo to oczywistość - zatem zakładam, że tabele da się połączyć jakimś polem. Jeśli nie wchodzi w grę połączenie tych 2 tabel jakimś joinem i konieczne są 2 kursory, to też się da.


Witam,
Oczywiście da się połączyć natomiast problemem jest ciężkość tego zapytania. (wywala się)
kombinowałem w ten sposób żeby rozbić to na dwa cursory i na koniec pobierać odpowiednie dane.

W takim razie źle kombinujesz, bo to co robisz to jakaś kompletna bzdura.
Lepiej napisz dlaczego Ci się to zapytanie wywala jak połączysz dane.
Marcin N.

Marcin N. Expert, Santander
Consumer Bank S.A.

Temat: PL-SQL

możesz napisać jakąś pętlę w stylu:

CURSOR cur_1 IS
SELECT t.* FROM tabela t
rec_1 cur_1%ROWTYPE;

CURSOR cur_2(c_data IN DATE) IS
SELECT *
FROM tabela t
WHERE t.data = c_data;
rec_2 cur_2%ROWTYPE;

rec_1 := NULL;
OPEN cur_1;
LOOP
FETCH cur_1
INTO rec_1;
EXIT WHEN cur_1%NOTFOUND;
IF rec_1.data = sysdate-1 THEN

rec_2 := NULL;
OPEN cur_2(rec_1.data);
LOOP
FETCH cur_2 INTO rec_2;
EXIT WHEN cur_2%NOTFOUND;
END LOOP;
CLOSE cur_2;

--wyniki:
rec_1.data, rec_1.ilosc_zamowien, rec_2....

END IF
END LOOP;
CLOSE cur_1;
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: PL-SQL

No i dlatego pytałem o strukturę bazy. A jaki to silnik ogóle?
Chciałem wypróbować różne opcje i podpowiedzieć co i jak zrobić.

Ile bilionów wierszy z danymi tam masz, że SQL wolno działa? Jak mi zapytanie wolno działało to zazwyczaj była to moja wina...



Wyślij zaproszenie do