2016-05-25 35 views
5

W dokumentacji here następujący przykład kodu należy podać przy użyciu cursor:Firebird kursory - Dlaczego byłoby użyć jednego

execute block 
returns (
    relation char(31), 
    sysflag int) 
as 
declare cur cursor for 
    (select rdb$relation_name, rdb$system_flag from rdb$relations); 
begin 
    open cur; 
    while (1=1) do 
    begin 
    fetch cur into relation, sysflag; 
    if (row_count = 0) then leave; 
    suspend; 
    end 
    close cur; 
end 

Ale może to być również wykonane w następujący sposób:

execute block 
returns (
    relation char(31), 
    sysflag int) 
as 
begin 
    for select rdb$relation_name, rdb$system_flag 
    from rdb$relations 
    into relation, sysflag 
    do begin 
    suspend; 
    end 
end 

Dlaczego miałbym chcieć go użyć? Ostatecznie powyższy przykład nie wymaga nawet execlute block, ponieważ jest to po prostu prosta instrukcja select. Tak więc przypuszczam, że przykład jest zbyt prosty, aby pokazać korzyści z tego.

+0

Aktualna wersja dokumentacji zawiera nieco bardziej złożony przykład: http://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-coding.html#fblangref25-psql- declare-cursor –

Odpowiedz

2

Dokumentacja link do (i jego newer 2.5 counterpart) zawiera już większość z powodów, byś (lub nie) używać kursora (kopalnia nacisk):

Jeśli kursor jest potrzebna tylko na spacer zestaw wyników, jest prawie zawsze łatwiejsze i mniej podatne na błędy, aby użyć oświadczenie z klauzula . Zadeklarowane kursory muszą być jawnie otwarte, używane do pobierania danych i zamykania. Zmienna kontekstowa musi być sprawdzana po każdym pobraniu, a jeśli jej wartość wynosi zero, pętla musi zostać zakończona. Instrukcja FOR SELECT sprawdza to automatycznie.

Mimo to, zadeklarowane kursory zapewniają wysoki poziom kontroli nad zdarzeniami sekwencyjnymi i umożliwiają równoległe zarządzanie kilkoma kursorami.

Tak w skrócie, należy użyć FOR SELECT zwykle, z wyjątkiem, gdy trzeba dostęp do wielu kursorów w tym samym czasie, czy może trzeba trochę bardziej skomplikowaną logikę niż tylko zwykłą pętlę. Umożliwia także ponowne użycie tej samej definicji kursora w wielu częściach kodu (chociaż może to wskazywać na konieczność podzielenia kodu w wielu przechowywanych procedurach).

Obecność narzędzia nie oznacza, że ​​należy go używać do wszystkiego.

Na marginesie, FOR SELECT jest również kursorem, z wyjątkiem braku wyraźnej kontroli nad nim (ukrywa on większość brzydoty;)).

1

Inną sytuacją, w której można używać kursorów, jest konieczność zaktualizowania pobranych wierszy, a znalezienie lub repozycjonowanie (określenie dokładnej klauzuli WHERE) może stanowić problem. W takim przypadku możesz otwierać kursory za pomocą klauzuli FOR UPDATE i aktualizować (lub usuwać) wiersze, używając klauzuli WHERE CURRENT OF.

+0

Dziękuję, to dobra uwaga. – Paul