Se puede reemplazar el open , close y fetch usando for
CREATE OR REPLACE FUNCTION SF_REFCURSOR
RETURN SYS_REFCURSOR IS
CV SYS_REFCURSOR;
V_SQL VARCHAR2(100);
BEGIN
V_SQL:=
'SELECT EMPLOYEE_LAST_NAME FROM EMPLOYEES';
OPEN CV FROM V_SQL;
END;
sqlplus/nolog
connect hr/hr
variable cv refcursor
execute :cv := sf_refcursor
print cv
Otro Ejempo:
DECLARE
v_correo employees.email%TYPE:='';
n_salario employees.salary%TYPE :=1000;
TYPE typEmp IS TABLE OF employees%ROWTYPE
INDEX BY employees.email%TYPE;
l_empleado typEmp;
PROCEDURE cargaArreglo IS
FOR reg IN (SELECT * FROM employees) LOOP
l_empleado(reg.email) := reg;
END LOOP;
END;
BEGIN
cargaArreglo; -- Deberia estar en un Package y ser invocado la primera vez
IF l_empleado(v_correo).salary > n_salario THEN
DBM_OUTPUT.PUT_LINE(l_empleado(v_correo).last_name ||'SUPERA EL MONTO');
ELSE
DBMS_OUTPUT.PUT_LINE(l_empleado(v_correo).last_name||'NO SUPERA EL MONTO');
END IF;
END;
4. Afinamiento Pl/Sql
Modularizar el Codigo
Usar PLS_INTEGER que es más eficiente que usar INTEGER, xq usa aritmetica de CPU y no de Librerias.
Usar y recorrer las colecciones en vez de los cursores con BULK
También se usan las colecciones para manejar las excepciones de error BULK_EXCEPTIONS
5. Características del Motor
La Base de datos puede manejar políticas de acceso a tablas agregando predicados luego del WHERE.
Para esto se personalizan Contextos y evitamos modificar las aplicaciones a las que accede un usario para temas de seguridad.
CREATE CONTEXT
Para cargar la Política se usa DBMS_RLS.ADD POLICY
6. Profiling
Para Monitorieo de Packages. Se usa el Package DBMS_PROFILER
Buscar siempre en la vista USER_SOURCE para ver qué linea da el problema que sale en el profiling