Red de conocimiento informático - Aprendizaje de código fuente - ¿Cuáles son los dos tipos de cursores estáticos en la base de datos?

¿Cuáles son los dos tipos de cursores estáticos en la base de datos?

Un cursor es un espacio de trabajo de memoria de SQL, definido en forma de variables por el sistema o usuario. El propósito de un cursor es almacenar temporalmente bloques de datos extraídos de la base de datos. Hay tres tipos de cursor en la base de datos Oracle: cursor estático: dividido en cursor explícito y cursor implícito: es un tipo de referencia, similar a un puntero. A continuación presentamos su uso uno por uno.

1. Cursor implícito

1) Instrucción Select...INTO..., instrucción DML, utiliza cursor implícito. Además, se utiliza el cursor implícito mediante FOR LOOP.

2) Puede comprender el estado y los resultados de la operación a través de las propiedades del Cusor implícito. Los atributos de Cursor incluyen:

SQLROWCOUNT entero representa el número de filas de datos en las que la instrucción DML se ejecutó exitosamente.

SQLFOUND Un valor booleano TRUE indica que la operación de inserción, eliminación, actualización o consulta de una sola fila se realizó correctamente.

SQLNOTFOUND booleano es lo opuesto al valor de retorno de la propiedad SQLFOUND.

El tipo booleano SQLISOPEN es verdadero durante la ejecución de DML y falso una vez completada.

3) El sistema abre y cierra automáticamente el cursor implícito.

Por ejemplo:

setserveroutputon

declare

comenzar

actualizar empleadossetemployee_name='Mike'dondeemployee_id=1001;

siSQLFOUNDentonces

dbms_output.put_line('El nombre está actualizado');

else

dbms_output.put_line('El nombre no está actualizado');

endif

end

/

setserveroutputon

declarar

comenzar

fortableInfoin(select*fromuser_tables)loop

dbms_output.put_line(tableInfo.table_name);

endloop;

excepción

cuando otrosentonces

dbms_output.put_line(sqlerrm);

fin;

>

2. Cursor explícito

1) Los atributos del cursor explícito incluyen:

El significado del tipo de valor de retorno de los atributos del cursor

ROWCOUNT Tipo entero para obtener el número de filas de datos devueltas por la declaración FETCH

El tipo booleano FOUND es verdadero si la declaración FETCH más reciente devuelve una fila de datos; de lo contrario, es falso

NOTFOUND Tipo booleano y atributo FOUND devuelven El valor es opuesto

ISOPEN El valor es verdadero cuando se ha abierto el cursor booleano, de lo contrario es falso

2) El uso de Los cursores explícitos se dividen en cuatro pasos:

a Definir cursor---Cursor [Nombre del cursor] IS;

b Abrir cursor---Abrir [Nombre del cursor];

c Manipular datos---Obtener [nombre del cursor]

d Cerrar el cursor---Cerrar [Nombre del cursor]

Los siguientes son varios usos explícitos comunes del cursor.

lt;pgt;setserveroutputon

declarar

cursorcurisselect*fromuser_tables;

tableInfouser_tablesrowtype;

comenzar

comenzar

p>

opencur;

bucle

fetchcurintotableInfo;

salir cuandocurnotfound;

dbms_output.put_line(tableInfo.table_name);

endloop;lt;/pgt;lt;pgt;exception

cuando otrosentonces

dbms_output.put_line( sqlerrm);lt;/pgt;lt;pgt;closecur ;

end;

/lt;/pgt;

setserveroutputon

declarar

cursorcurisseselect*fromuser_tables;

comenzar

fortableInfoincurloop

dbms_output.put_line(tableInfo.table_name);

endloop;

excepción

cuando otrosentonces

dbms_output.put_line(sqlerrm);

end;

/

También puedes usarlo con parámetros de cursor abierto.

lt;pgt;setserveroutputon

declarar

cursorcur(tblNamevarchar2)isselect*fromuser_constraintswheretable_name=tblName;

tableInfouser_constraintsrowtype;

comenzar

opencur('EMPLEADOS');

bucle

fetchcurintotableInfo;

salir cuandocurnotfound;

dbms_output.put_line(tableInfo.constraint_name);

endloop;lt;/pgt;lt;pgt;exception

cuando otrosentonces

dbms_output.put_line(sqlerrm) ;lt;/pgt;lt;pgt;closecur;

end;

/lt;/pgt;lt;pgt;lt;/pgt;

setserveroutputon

declarar

cursorcur(tblNamevarchar2)isselect*fromuser_constraintswheretable_name=tblName;

comenzar

fortableInfoincur('EMPLOYEES')bucle

dbms_output.put_line(tableInfo.constraint_name);

endloop;

excepción

cuando otrosentonces

dbms_output.put_line( sqlerrm);

end

/

Puede utilizar la cláusula WHERE CURRENT OF para realizar operaciones ACTUALIZAR o ELIMINAR.

establecer la salida del servidor

declarar

cursorcurisselect*fromemployeesforupdate;

comenzar

fortableInfoincurloop

updateemployeessetsalarysalary=salario*1.1wherecurrentofcur;

endloop;

commit;

excepción

cuando otrosentonces

dbms_output. put_line(sqlerrm);

end;

/

3.REF CURSOR (Variables de cursor)

Cursor REF al ejecutar Para determinar la consulta utilizada por el cursor. Usando REF CURSOR, puede transferir conjuntos de resultados entre programas (abrir una variable de cursor en un programa y procesar datos en otro programa).

También puede utilizar REF CURSOR para implementar BULK SQL y mejorar el rendimiento de SQL.

El CURSOR DE REF se divide en dos tipos, CURSOR DE REF fuerte y CURSOR DE REF débil.

CURSOR REF fuerte: especifique el tipo de retorno. El tipo de la variable CURSOR debe ser coherente con el tipo de retorno.

CURSOR DE REF débil: no especifica el tipo de retorno, puede coincidir con cualquier tipo de variable CURSOR.

Uso del cursor de referencia:

1) Escriba [nombre del tipo de cursor] es cursor de referencia

2) Abrir cursor para...

3) Recuperar [nombre del cursor]

4) Cerrar el cursor

Por ejemplo:

Paso 1:

createorreplacepackageTESTas

typeemployees_refcursor_typeisrefcursorreturnemployeesrowtype;

procedureemployees_loop(employees_curINemployees_refcursor_type);

finalizar PRUEBA;

/

Paso 2:

crearoreemplazarpackagebodyTESTas

procedureemployees_loop(employees_curINemployees_refcursor_type)es

empemployeesrowtype;

comenzar

bucle

fetchemployees_curintoemp;

exitwhenemployees_curNOTFOUND;

dbms_output.put_line(emp.employee_id);

endloop;

endemployees_loop;

endTEST;

/

Paso 3:

setserveroutputon

declarar

empRefCurTEST.employees_refcursor_type;

comenzar

foriin10..20loop

dbms_output.put_line('DepartmentID='||i);

openempRefCurforselect*fromemployeeswheredepartment_id=i;

TEST.employees_loop(empRefCur);

endloop;

excepción

cuando otrosentonces

dbms_output.put_line(sqlerrm);

p>

closeempRefCur;

end;

/

4.BULK SQL

Utilice FORALL y BULK COLLECT cláusulas.

El uso de BULK SQL puede reducir la sobrecarga de comunicación entre PLSQL Engine y SQL Engine y mejorar el rendimiento.

1. Para acelerar las declaraciones INSERT, UPDATE y DELETE, incluya la declaración SQL dentro de una declaración PL/SQL FORALL en lugar de una construcción de bucle. Para acelerar la ejecución de las declaraciones INSERT, UPDATE y DELETE. , es decir, utilice la instrucción FORALL para reemplazar la instrucción de bucle.

2. Para acelerar las declaraciones SELECT, incluya la cláusula BULK COLLECT INTO en la declaración SELECT en lugar de usar INTO. Para acelerar SELECT, use BULK COLLECT INTO en lugar de INTO.

SQLgt;createtableemployees_tmpasselect first_name,last_name,salaryfromemployeeswhere0=1;

setserveroutputon

declare

cursoremployees_cur(depIdemployees.department_idtype)isselectfirst_name,last_name, salariofromemployeeswheredepartment_id=depId;

typeemployee_table_typeistableofemployees_currowtypeindexbypls_integer;

employee_tableemployee_table_type;

comenzar

openemployees_cur(100);

fetchemployees_curbulkcollectintoemployee_table ;

closeemployees_cur;

foriin1..employee_table.countloop

dbms_output.put_line(employee_table(i).first_name||''||employee_table(i) .last_name||','||employee_table(i).salary);

endloop;

foralliinemployee_table.first..employee_table.last

insertar enemployees_tmpvalues( empleado_table(i).primer_nombre, empleado_table(i).apellido, empleado_table(i).salario

compromiso

fin

/p>