it-swarm-es.tech

¿Cuál es la diferencia entre cursores explícitos e implícitos en Oracle?

Estoy un poco oxidado en mi jerga de cursor en PL/SQL. Alguien sabe esto?

25
Brian G

Un cursor implícito es uno creado "automáticamente" por Oracle cuando ejecuta una consulta. Es más simple de codificar, pero sufre de

  • ineficiencia (el estándar ANSI especifica que debe buscar dos veces para verificar si hay más de un registro)
  • vulnerabilidad a errores de datos (si alguna vez obtiene dos filas, genera una excepción TOO_MANY_ROWS)

Ejemplo

SELECT col INTO var FROM table WHERE something;

Un cursor explícito es uno que crea usted mismo. Requiere más código, pero brinda más control; por ejemplo, puede abrir-buscar-cerrar si solo desea el primer registro y no le importa si hay otros.

Ejemplo

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

Un cursor explícito se define como tal en un bloque de declaración:

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

un cursor implícito se implementa directamente en un bloque de código:

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

1. CURSOR: Cuando PLSQL emite sentencias sql, crea un área de trabajo privada para analizar y ejecutar la sentencia sql que se llama cursor.

2.IMPLICIT: cuando cualquier bloque ejecutable PL/SQL emite una instrucción sql. PL/SQL crea un cursor implícito y lo gestiona automáticamente, lo que significa que se abre y cierra implícitamente. Se usa cuando la instrucción sql devuelve solo una fila. Tiene 4 atributos SQL% ROWCOUNT, SQL% FOUND, SQL% NOTFOUND, SQL% ISOPEN.

3.EXPLICIT: es creado y administrado por el programador. Necesita cada vez explícito abrir, buscar y cerrar. Se utiliza cuando la instrucción sql devuelve más de una fila. También tiene 4 atributos CUR_NAME% ROWCOUNT, CUR_NAME% FOUND, CUR_NAME% NOTFOUND, CUR_NAME% ISOPEN. Procesa varias filas utilizando el bucle. El programador también puede pasar el parámetro al cursor explícito.

  • Ejemplo: cursor explícito

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

Los cursores implícitos requieren memoria buffer anónima.

Los cursores explícitos se pueden ejecutar una y otra vez utilizando su nombre. Se almacenan en un espacio de memoria definido por el usuario en lugar de almacenarse en una memoria de almacenamiento anónima y, por lo tanto, se puede acceder fácilmente después.

3
prince
3
pablo

Un cursor explícito es uno que declara, como:

CURSOR my_cursor IS
  SELECT table_name FROM USER_TABLES

Un cursor implícito es uno creado para admitir cualquier SQL en línea que escriba (ya sea estático o dinámico).

3
Dave Costa

En respuesta a la primera pregunta. Directamente desde el Oracle documentación

Un cursor es un puntero a un área SQL privada que almacena información sobre el procesamiento de una instrucción SELECT o DML específica.

3
Ian Carpenter

Con los cursores explícitos, tiene control total sobre cómo acceder a la información en la base de datos. Usted decide cuándo ABRIR el cursor, cuándo OBTENER registros del cursor (y, por lo tanto, de la tabla o tablas en la instrucción SELECT del cursor) cuántos registros buscar y cuándo CERRAR el cursor. La información sobre el estado actual de su cursor está disponible mediante el examen de los atributos del cursor.

Ver http://www.unix.com.ua/orelly/Oracle/prog2/ch06_03.htm para más detalles.

2
Kristian

En PL/SQL, un cursor es un puntero a esta área de contexto. Contiene toda la información necesaria para procesar la declaración.

Cursores implícitos: Los cursores implícitos son creados automáticamente por Oracle cada vez que se ejecuta una instrucción SQL, cuando no hay un cursor explícito para la instrucción. Los programadores no pueden controlar los cursores implícitos y la información que contienen.

Cursores explícitos: Los cursores explícitos son cursores definidos por el programador para obtener más control sobre el área de contexto. Se debe definir un cursor explícito en la sección de declaración del bloque PL/SQL. Se crea en una instrucción SELECT que devuelve más de una fila.

La sintaxis para crear un cursor explícito es:

CURSOR cursor_name IS select_statement; 
1
GOVIND DIXIT

Un cursor es una ventana SELECCIONADA en una tabla de Oracle, esto significa un grupo de registros presentes en una tabla de Oracle y que satisfacen ciertas condiciones. Un cursor también puede SELECCIONAR todo el contenido de una tabla. Con un cursor puede manipular columnas de Oracle, alias en el resultado. Un ejemplo de cursor implícito es el siguiente:

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

Con FOR ... LOOP ... END LOOP, abre y cierra el cursor automáticamente, cuando todos los registros del cursor han sido analizados.

Un ejemplo de cursor explícito es el siguiente:

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

En el cursor explícito, abre y cierra el cursor de forma explícita, verificando la presencia de registros y estableciendo una condición de salida.

1
UltraCommit

Google es tu amigo: http://docstore.mik.ua/orelly/Oracle/prog2/ch06_03.htm

PL/SQL emite un cursor implícito cada vez que ejecuta una instrucción SQL directamente en su código, siempre que ese código no emplee un cursor explícito. Se llama cursor "implícito" porque usted, el desarrollador, no declara explícitamente un cursor para la instrucción SQL.

Un cursor explícito es una instrucción SELECT que se define explícitamente en la sección de declaración de su código y, en el proceso, se le asigna un nombre. No existe un cursor explícito para las instrucciones UPDATE, DELETE e INSERT.

1
Derek Swingley

El cursor implícito devuelve solo un registro y se llama automáticamente. Sin embargo, los cursores explícitos se llaman manualmente y pueden devolver más de un registro.

1
shaiksyedbasha

Sé que esta es una vieja pregunta, sin embargo, creo que sería bueno agregar un ejemplo práctico para mostrar la diferencia entre los dos desde el punto de vista del rendimiento.

Desde el punto de vista del rendimiento, los cursores implícitos son más rápidos.

Veamos la diferencia de rendimiento entre los dos:

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.

Entonces, una diferencia significativa es claramente visible.

Más ejemplos aquí .

1
Lalit Kumar B

Cada instrucción SQL ejecutada por la base de datos Oracle tiene un cursor asociado, que es un área de trabajo privada para almacenar información de procesamiento. Los cursores implícitos son creados implícitamente por el servidor Oracle para todas las declaraciones DML y SELECT.

Puede declarar y usar cursores explícitos para nombrar el área de trabajo privada y acceder a su información almacenada en su bloque de programa.

0
ropable

Como se indicó en otras respuestas, los cursores implícitos son más fáciles de usar y menos propensos a errores.

Y Cursores implícitos frente a cursores explícitos en Oracle PL/SQL muestra que los cursores implícitos son hasta dos veces más rápidos que los cursores explícitos también.

Es extraño que nadie haya mencionado todavía Cursor FOR LOOP implícito :

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;

Otro ejemplo en SO: PL/SQL FOR LOOP IMPLICIT CURSOR .

Es mucho más corto que la forma explícita.

Esto también proporciona una buena solución para actualizar varias tablas desde CTE .

0
Vadzim