Od roku piszę podstawowe aplikacje internetowe (dla bazy danych Oracle), a ponieważ funkcje są dość proste, większość z nas trzyma regularne pętle FOR, aby uzyskać nasze dane:
for i in (select * from STUDENTS) loop
htp.prn(i.student_last_name || ', ' || i.student_first_name || ' ' || i.student_dob);
end loop;
Ale kursory wydają się być „właściwym” sposobem robienia rzeczy. Mogę znaleźć wiele informacji o tym, czym są kursory i różne sposoby ich przewijania, ale nie mogę znaleźć solidnego powodu, aby używać ich w zwykłych pętlach FOR. Czy to zależy od potrzeb procedury? Czy są jakieś nieodłączne zalety, o których powinienem wiedzieć?
FOR
jest tylko innym sposobem korzystania z kursorów. Zobacz dokumentację: docs.oracle.com/cd/E11882_01/appdev.112/e10472/... W każdym razie, co robi htp.prn ()?FOR
Myślę, że w przypadku tego typu rzeczy pętla jest znacznie bardziej czytelna. Zwykle używam „prawdziwych” kursorów tylko wtedy, gdy muszę cofnąć się, nie tylko do przodu. Zadałem to drugie pytanie, ponieważ mogę sobie wyobrazić funkcję tabeli zamiasthtp.prn()
.Odpowiedzi:
Kursor może być jawny lub niejawny, a dowolny typ może być użyty w pętli FOR. Są naprawdę dwa aspekty twojego pytania.
Po co używać jawnej pętli FOR kursora nad niejawną pętlą FOR kursora?
Po co używać pętli z FETCH zamiast pętli FOR, która nie ma jawnego FETCH?
Oto kilka przydatnych informacji z dokumentacji.
Przykład niejawnego kursora dla pętli
Przykład jawnego kursora dla pętli
Domniemany Kursor
Jawny kursor
Instrukcje kursora dla pętli
źródło
Kod, który opublikowałeś, używa kursora. Używa niejawnej pętli kursora.
Są przypadki, w których użycie jawnej pętli kursora (tj. Zadeklarowanie zmiennej CURSOR w sekcji deklaracji) daje czystszy kod lub lepszą wydajność
student_cursor
zamiast zawierać 30-wierszową instrukcję SQL, która zawiera logikę. Na przykład, jeśli drukowałeś wszystkich studentów, którzy otrzymali pozwolenie na ukończenie studiów i którzy polegali na dołączeniu do tabel, które miały ich akademickie akta, wymagania dotyczące ich programu studiów, tabele z informacją o akademickich akademikach, tabele z informacjami o zaległych książkach bibliotecznych, w tabelach z informacjami o niezapłaconych opłatach, nadpisaniach administracyjnych itp. prawdopodobnie sensowne byłoby przefakturowanie kodu, aby zapytanie nie utknęło w środku kodu związanego z przedstawieniem listy użytkownikowi. Może to obejmować utworzenie widoku, który zawierałby całą tę logikę. Lub może obejmować utworzenie wyraźnego kursora, który został zadeklarowany jako część bieżącego bloku PL / SQL lub w jakimś bloku PL / SQL wyższego poziomu (tj. kursor zadeklarowany w pakiecie), dzięki czemu można go ponownie użyć. Lub może to wymagać wykonania czegoś innego w celu enkapsulacji i ponownego użycia (powiedzmy, tworząc zamiast tego potokową funkcję tabeli).htp.prn
, toBULK COLLECT
prawdopodobnie nic nie kupisz. W innych przypadkach może to jednak spowodować znaczną poprawę wydajności.źródło
Widzę, że wielu programistów używa jawnych kursorów zamiast domyślnych kursorów ze starego nawyku. To dlatego, że w wersji 7 Oracle była to zawsze bardziej wydajna droga. W dzisiejszych czasach jest ogólnie na odwrót. Specjalnie z optymalizatorem, który w razie potrzeby może przepisać niejawny kursor dla pętli do kolekcjonowania zbiorczego.
źródło
Ostatnio musiałem przepisać kilka zapytań z niejawnej pętli FOR na wyraźne kursory. Powodem było to, że zapytania pobierały dane z zewnętrznej bazy danych przez łącze, a ta baza danych miała inne kodowanie niż nasza lokalna baza danych. Podczas przesyłania danych z niejawnego kursora do zdefiniowanego lokalnie typu rekordu wystąpiły tajemnicze błędy przerywane (tylko w niektórych określonych wierszach). Nasz DBA wyjaśnił nam to, że sami nie bylibyśmy w stanie dojść do sedna. Wygląda na to, że zgłoszono błąd w Oracle.
Zalecono nam przepisanie wszystkiego za pomocą wyraźnych kursorów, a błąd zniknął.
Nie jest to główny powód, dla którego możesz chcieć używać jawnych treści, ale warto to zanotować.
EDYCJA: Oracle 12c.
źródło