it-swarm-tr.com

Oracle’da açık ve kapalı imleçler arasındaki fark nedir?

PL/SQL'de imleç dilimde biraz paslanmışım. Bunu bilen var mı?

25
Brian G

Örtülü bir imleç, Oracle tarafından bir sorgu çalıştırdığınızda sizin için "otomatik olarak" oluşturulur. Kodlaması daha kolaydır, ancak 

  • verimsizlik (ANSI standardı, birden fazla kayıt olup olmadığını kontrol etmek için iki kez getirmesi gerektiğini belirtir)
  • veri hatalarına karşı güvenlik açığı (iki satır alırsanız, bir TOO_MANY_ROWS istisnası oluşturur)

Örnek

SELECT col INTO var FROM table WHERE something;

Açık bir imleç, kendiniz oluşturduğunuzdur. Daha fazla kod alır, ancak daha fazla kontrol sağlar - örneğin, yalnızca ilk kaydı istiyorsanız ve başkaları olup olmadığını umursamadığınızda, yalnızca aç-kapat özelliğini açabilirsiniz. 

Örnek

DECLARE   
  CURSOR cur IS SELECT col FROM table WHERE something; 
BEGIN
  OPEN cur;
  FETCH cur INTO var;
  CLOSE cur;
END;
39
Sten Vesterli

Açık bir imleç bir bildirim bloğunda olduğu gibi tanımlanır:

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

Örtük bir imleç doğrudan bir kod bloğuna basılır:

...
BEGIN
   SELECT columns INTO variables FROM table where condition;
END;
...
16
stjohnroe

1.CURSOR: PLSQL sql deyimlerini yayınladığında özel çalışma alanı oluşturur. sql deyimini ayrıştırmak ve yürütmek için imleç adı verilir.

2. UYGULAMA: Herhangi bir PL/SQLexecutable bloğu sql deyimini yayınladığında . PL/SQL örtülü imleç yaratır ve otomatik olarak yönetir. implcit aç ve kapat gerçekleşir. Sql deyimi return .__ kullanılırken kullanılır. sadece bir satır. 4 nitelikleri vardır SQL% ROWCOUNT, SQL% FOUND, SQL% NOTFOUND, SQL% ISOPEN.

3.EXPLICIT: Programcı tarafından oluşturulur ve yönetilir. Her birine ihtiyacı var. açık, aç, getir ve kapat. Sql deyimi .__ kullanılır. birden fazla satır döndürür Ayrıca 4 özelliği vardır. CUR_NAME% ROWCOUNT, CUR_NAME% FOUND, CUR_NAME% NOTFOUND, CUR_NAME% ISOpen. Döngü kullanarak birkaç satırı işler. Programcı, imleci açık imleç için de parametreyi geçebilir.

  • Örnek: Açık İmleç

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
Ganesh Pathare

Örtük imleçler, adsız arabellek belleği gerektirir. 

Belirgin imleçler isimleri kullanılarak tekrar tekrar çalıştırılabilirler. Bunlar isimsiz bir tampon bellekte saklanmak yerine kullanıcı tanımlı hafıza alanında saklanır ve böylece kolayca erişilebilir.

3
prince
3
pablo

Açık bir imleç, şöyle bildirdiğinizdir:

CURSOR my_cursor IS
  SELECT table_name FROM USER_TABLES

Örtük bir imleç yazdığınız herhangi bir satır içi SQL'yi (statik veya dinamik) desteklemek için yaratılmıştır.

3
Dave Costa

İlk soruya cevap olarak. Doğrudan Oracle’dan belgeler

Bir imleç özel bir SQL .__ için bir işaretçidir. .__ hakkında bilgi depolayan alan. belirli bir SELECT veya DML .__ işlemek. Beyan.

3
Ian Carpenter

Kesin imleçlerle, veritabanındaki bilgilere nasıl erişileceği üzerinde tam kontrol sahibi olacaksınız. İmleci ne zaman açacağınıza, ne zaman FETCH imlecinden (ve dolayısıyla imlecin SELECT deyimindeki tablodan veya tablolardan) ne zaman alınacağına ve imlecin ne zaman kapanacağına karar verirsiniz. İmlecinizin şu anki durumu hakkında bilgi, imleç özelliklerinin incelenmesiyle elde edilebilir.

Detaylar için http://www.unix.com.ua/orelly/Oracle/prog2/ch06_03.htm adresine bakınız.

2
Kristian

PL/SQL'de, bir imleç bu içerik alanının bir göstergesidir. İfadenin işlenmesi için gerekli tüm bilgileri içerir.

Implicit Cursors: Gizli imleçler, bir SQL ifadesi yürütüldüğünde, ifade için açık bir imleç olmadığında Oracle tarafından otomatik olarak oluşturulur. Programcılar örtülü imleçleri ve içindeki bilgileri kontrol edemez.

Açık Cursors: Açık imleçler, bağlam alanı üzerinde daha fazla kontrol sahibi olmak için programcı tarafından tanımlanan imleçlerdir. Açık bir imleç, PL/SQL Bloğunun bildirim bölümünde tanımlanmalıdır. Birden fazla satır döndüren bir SELECT ifadesinde oluşturulur.

Açık bir imleç oluşturma sözdizimi şöyledir:

CURSOR cursor_name IS select_statement; 
1
GOVIND DIXIT

İmleç, Oracle tablosundaki SELECTed bir penceredir; bu, Oracle tablosunda bulunan ve belirli koşulları sağlayan bir grup kayıt anlamına gelir. Bir imleç aynı zamanda bir tablonun tüm içeriğini SEÇEBİLİR. Bir imleç ile Oracle sütunlarını değiştirebilir ve sonuçta bunları diğer adlara ayırabilirsiniz. Örtük imleç örneği şudur:

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;
/

FOR ... LOOP ... END LOOP ile imlecin tüm kayıtları analiz edildiğinde imleci otomatik olarak açar ve kapatırsınız.

Açık imleç örneği şudur:

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;
/

Açık imleçte, imleci açık bir şekilde açıp kapatırsınız, kayıtların varlığını kontrol eder ve bir çıkış koşulunu belirtirsiniz.

1
UltraCommit

Google senin arkadaşın: http://docstore.mik.ua/orelly/Oracle/prog2/ch06_03.htm

PL/SQL, örtük imleç verir. ne zaman bir SQL deyimini çalıştırsanız Direkt olarak kodunuzda, o kadar. kodu açık bir şekilde kullanılmamaktadır. imleç. Buna "örtük" adı verilir. imleç çünkü siz, geliştirici, yapın. açıkça imlecini SQL deyimi.

Açık bir imleç bir SELECT açıkça tanımlanmış olan ifade. senin beyannın bölümünde. kodu ve işlem sırasında, bir a. ad. .__ diye bir şey yoktur. UPDATE, DELETE, .__ için açık imleç. ve INSERT ifadeleri.

1
Derek Swingley

Örtük imleç yalnızca bir kayıt döndürür ve otomatik olarak çağrılır. Ancak, açık imleçler manuel olarak aranır ve birden fazla kayıt döndürür.

1
shaiksyedbasha

Bunun eski bir soru olduğunu biliyorum, ancak ikisi arasındaki farkı performans açısından göstermek için pratik bir örnek eklemenin iyi olacağını düşünüyorum.

Performans açısından, Implicit imleçleri daha hızlıdır.

İkisi arasındaki performans farkını görelim:

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.

Yani, önemli bir fark açıkça görülebilir.

Diğer örnekler burada .

1
Lalit Kumar B

Oracle veritabanı tarafından yürütülen her SQL ifadesinde, işlem bilgilerini depolamak için özel bir çalışma alanı olan kendisiyle ilişkili bir imleç bulunur. Örtülü imleçler, tüm DML ve SELECT ifadeleri için Oracle sunucusu tarafından örtük olarak oluşturulur.

Özel çalışma alanını adlandırmak ve program bloğunuzdaki depolanan bilgilere erişmek için Açık imleçler beyan edebilir ve kullanabilirsiniz.

0
ropable

Diğer cevaplarda belirtildiği gibi, örtülü imleçlerin kullanımı daha kolaydır ve daha az hataya meyillidir. 

Ve Oracle PL/SQL'deki Açıklayıcı ve Açık İmleçler , açıklayıcıların açık olanlardan iki kat daha hızlı olduğunu gösterir.

Henüz kimsenin bahsetmemesi garip, LOOP İmleci İÇİN İYİ :

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;

SO ile ilgili bir başka örnek: LOOP UYGULAMASI CURSOR İÇİN PL/SQL .

Açık formdan çok daha kısa.

Bu ayrıca CTE'den çoklu tabloları güncelleme için Güzel bir geçici çözüm sunar.

0
Vadzim