¿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); p>
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 p>
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 p>
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 p>
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; p >
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>p>