Jaka jest różnica między kursorami jawnymi a domyślnymi w Oracle?

Jestem trochę zardzewiały na moim żargonie kursora w PL / SQL. Ktoś o tym wie?

Author: Brian G, 2008-09-16

15 answers

Ukryty kursor jest tworzony "automatycznie" dla Ciebie przez Oracle podczas wykonywania zapytania. Jest prostszy w kodowaniu, ale cierpi na

  • nieefektywność (standard ANSI określa, że musi pobrać dwa razy, aby sprawdzić, czy istnieje więcej niż jeden rekord)
  • podatność na błędy danych (jeśli kiedykolwiek otrzymasz dwa wiersze, spowoduje to wyjątek TOO_MANY_ROWS)

Przykład

SELECT col INTO var FROM table WHERE something;

Wyraźny kursor to taki, który tworzysz sam. Potrzeba więcej kodu, ale daje więcej kontrola-na przykład, możesz po prostu otworzyć-pobrać-zamknąć, jeśli chcesz tylko pierwszy rekord i nie obchodzi cię, czy istnieją inne.

Przykład

DECLARE   
  CURSOR cur IS SELECT col FROM table WHERE something; 
BEGIN
  OPEN cur;
  FETCH cur INTO var;
  CLOSE cur;
END;
 37
Author: Sten Vesterli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 05:14:43

Jawny kursor jest zdefiniowany jako taki w bloku deklaracji:

DECLARE 
CURSOR cur IS 
  SELECT columns FROM table WHERE condition;
BEGIN
...

Ukryty kursor jest wstawiany bezpośrednio do bloku kodu:

...
BEGIN
   SELECT columns INTO variables FROM table where condition;
END;
...
 16
Author: stjohnroe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 16:18:07

Jawny kursor to taki, który deklarujesz, jak:

CURSOR my_cursor IS
  SELECT table_name FROM USER_TABLES

Ukryty kursor to kursor stworzony do obsługi dowolnego pisanego w wierszu SQL (statycznego lub dynamicznego).

 4
Author: Dave Costa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 16:13:56

1.Kursor: gdy PLSQL wydaje polecenia sql, tworzy prywatny obszar roboczy aby przetworzyć i wykonać polecenie SQL nazywa się kursorem.

2.IMPLICIT: gdy dowolny blok PL / SQLexecutable wydaje polecenie sql. PL / SQL tworzy Ukryty kursor i zarządza automatycznie oznacza implcit open & close ma miejsce. Używany przy zwracaniu polecenia sql tylko jeden row.It posiada 4 atrybuty SQL%ROWCOUNT, znaleziono SQL%, SQL % NOTFOUND, SQL % ISOPEN.

3.EXPLICIT: jest tworzony i zarządzany przez programista. Potrzebuje każdego czas jawny otwórz, Pobierz i zamknij. Jest używany, gdy polecenie sql zwraca więcej niż jeden wiersz. Posiada również 4 atrybuty CUR_NAME % ROWCOUNT,CUR_NAME % FOUND,CUR_NAME % NOTFOUND, CUR_NAME % ISOPEN. Przetwarza kilka wierszy za pomocą pętli. Programista może również przekazać parametr do jawnego kursora.

  • Przykład: Explicit Cursor

 

declare 
   cursor emp_cursor 
   is 
   select id,name,salary,dept_id 
   from employees; 
   v_id employees.id%type; 
   v_name employees.name%type; 
   v_salary employees.salary%type; 
   v_dept_id employees.dept_id%type; 
   begin 
   open emp_cursor; 
   loop 
   fetch emp_cursor into v_id,v_name,v_salary,v_dept_id; 
   exit when emp_cursor%notfound;
   dbms_output.put_line(v_id||', '||v_name||', '||v_salary||','||v_dept_id); 
   end loop;                    
   close emp_cursor; 
   end;
 4
Author: Ganesh Pathare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-13 09:29:35
 3
Author: pablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 14:46:35

W odpowiedzi na pierwsze pytanie. Prosto z wyroczni Dokumentacja

Kursor jest wskaźnikiem do prywatnego SQL obszar, który przechowuje informacje o przetwarzanie określonego SELECT lub DML oświadczenie.

 3
Author: Ian Carpenter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-13 09:32:22

Ukryte Kursory wymagają anonimowej pamięci bufora.

Jawne Kursory mogą być wykonywane wielokrotnie, używając ich nazwy.Są one przechowywane w przestrzeni pamięci zdefiniowanej przez użytkownika, a nie są przechowywane w anonimowej pamięci buforowej, a zatem mogą być łatwo dostępne później.

 3
Author: prince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-11 06:16:30

Z jawnymi kursorami masz pełną kontrolę nad dostępem do informacji w bazie danych. Ty decydujesz, kiedy otworzyć kursor, kiedy pobrać rekordy z kursora (a więc z tabeli lub tabel w instrukcji SELECT kursora), ile rekordów pobrać i kiedy zamknąć kursor. Informacje o aktualnym stanie kursora są dostępne poprzez sprawdzenie atrybutów kursora.

Zobacz http://www.unix.com.ua/orelly/oracle/prog2/ch06_03.htm Po szczegóły.

 2
Author: Kristian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 17:08:35

Google to twój przyjaciel: http://docstore.mik.ua/orelly/oracle/prog2/ch06_03.htm

PL / SQL wyświetla Ukryty kursor za każdym razem, gdy wykonujesz polecenie SQL bezpośrednio w Twoim kodzie, o ile to kod nie wykorzystuje jawnego kursor. Nazywa się to " implicit" kursor, bo ty, deweloper, robisz nie deklaruje jawnie kursora dla polecenie SQL.

Jawny kursor to SELECT oświadczenie, które jest wyraźnie zdefiniowane w sekcja deklaracji twojego kod i, w procesie, przypisany a nazwisko. Nie ma czegoś takiego jak jawny kursor do aktualizacji, usuwania, i wstawić Oświadczenia.

 1
Author: Derek Swingley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-13 05:13:38

Kursor jest wybranym oknem w tabeli Oracle, oznacza to grupę rekordów obecnych w tabeli Oracle i spełniających określone warunki. Kursor może również zaznaczyć całą zawartość tabeli. Za pomocą kursora można manipulować kolumnami Oracle, aliasując je w wyniku. Przykład ukrytego kursora jest następujący:

BEGIN
   DECLARE
      CURSOR C1
      IS
         SELECT DROPPED_CALLS FROM ALARM_UMTS;

      C1_REC   C1%ROWTYPE;
   BEGIN
      FOR C1_REC IN C1
      LOOP
         DBMS_OUTPUT.PUT_LINE ('DROPPED CALLS: ' || C1_REC.DROPPED_CALLS);
      END LOOP;
   END;
END;
/

Z FOR ... Pętla... Pętla końcowa otwierasz i zamykasz kursor automatycznie, gdy wszystkie rekordy kursora zostały przeanalizowane.

An przykład jawnego kursora jest następujący:

BEGIN
   DECLARE
      CURSOR C1
      IS
         SELECT DROPPED_CALLS FROM ALARM_UMTS;

      C1_REC   C1%ROWTYPE;
   BEGIN
      OPEN c1;

      LOOP
         FETCH c1 INTO c1_rec;

         EXIT WHEN c1%NOTFOUND;

         DBMS_OUTPUT.PUT_LINE ('DROPPED CALLS: ' || C1_REC.DROPPED_CALLS);
      END LOOP;

      CLOSE c1;
   END;
END;
/

W jawnym kursorze otwierasz i zamykasz kursor w jawny sposób, sprawdzając obecność rekordów i określając warunek zakończenia.

 1
Author: UltraCommit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-14 09:51:14

Ukryty kursor zwraca tylko jeden rekord i jest wywoływany automatycznie. Jednak jawne kursory są wywoływane ręcznie i mogą zwracać więcej niż jeden rekord.

 1
Author: shaiksyedbasha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-11 06:07:44

Wiem, że to stare pytanie, ale myślę, że dobrze byłoby dodać praktyczny przykład, aby pokazać różnicę między nimi z punktu widzenia wydajności.

Z punktu widzenia wydajności Ukryte kursory są szybsze.

Zobaczmy różnicę wydajności między tymi dwoma:

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    l_loops  NUMBER := 100000;
  3    l_dummy  dual.dummy%TYPE;
  4    l_start  NUMBER;
  5
  6    CURSOR c_dual IS
  7      SELECT dummy
  8      FROM   dual;
  9  BEGIN
 10    l_start := DBMS_UTILITY.get_time;
 11
 12    FOR i IN 1 .. l_loops LOOP
 13      OPEN  c_dual;
 14      FETCH c_dual
 15      INTO  l_dummy;
 16      CLOSE c_dual;
 17    END LOOP;
 18
 19    DBMS_OUTPUT.put_line('Explicit: ' ||
 20                         (DBMS_UTILITY.get_time - l_start) || ' hsecs');
 21
 22    l_start := DBMS_UTILITY.get_time;
 23
 24    FOR i IN 1 .. l_loops LOOP
 25      SELECT dummy
 26      INTO   l_dummy
 27      FROM   dual;
 28    END LOOP;
 29
 30    DBMS_OUTPUT.put_line('Implicit: ' ||
 31                         (DBMS_UTILITY.get_time - l_start) || ' hsecs');
 32  END;
 33  /
Explicit: 332 hsecs
Implicit: 176 hsecs

PL/SQL procedure successfully completed.

Więc znacząca różnica jest wyraźnie widoczna.

Więcej przykładów tutaj .

 1
Author: Lalit Kumar B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-09 08:59:34

Każde polecenie SQL wykonywane przez bazę danych Oracle ma powiązany z nim kursor, który jest prywatnym obszarem roboczym do przechowywania informacji przetwarzanych. Domyślne kursory są domyślnie tworzone przez serwer Oracle dla wszystkich instrukcji DML i SELECT.

Możesz zadeklarować i użyć jawnych kursorów, aby nazwać prywatny obszar roboczy i uzyskać dostęp do jego przechowywanych informacji w bloku programu.

 0
Author: ropable,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 00:56:37

Jak stwierdzono w innych odpowiedziach, Ukryte kursory są łatwiejsze w użyciu i mniej podatne na błędy.

I Kursory jawne w Oracle PL/SQL pokazują, że Kursory jawne są do dwóch razy szybsze od jawnych.

To dziwne, że nikt jeszcze nie wspomniał Implicit dla Loop Cursor :

begin
  for cur in (
    select t.id from parent_trx pt inner join trx t on pt.nested_id = t.id
    where t.started_at > sysdate - 31 and t.finished_at is null and t.extended_code is null
  )
  loop
    update trx set finished_at=sysdate, extended_code = -1 where id = cur.id;
    update parent_trx set result_code = -1 where nested_id = cur.id;
  end loop cur;
end;

Kolejny przykład NA SO: PL / SQL dla loop IMPLICIT CURSOR .

Jest znacznie krótsza niż forma Jawna.

To także zapewnia dobre obejście dla aktualizacji wielu tabel z CTE .

 0
Author: Vadzim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-16 17:50:41

Explicit...

Kursor foo to select * from blah; begin otwórz fetch exit po zamknięciu kursora yada yada Yada

Nie używaj ich, użyj implicit

Kursor foo to select * from bla;

Dla n W pętli foo x = n. some_column end loop

Myślę, że możesz nawet to zrobić

For n in (select * from bla) loop...

Trzymać się dorozumianych, zamykają się, są bardziej czytelne, ułatwiają życie.

 -2
Author: Ethan Post,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 05:20:39