Mi?rcoles, 24 de junio de 2015

Una de las técnicas para probar validaciones a un archivo es la creación/modificación de valores en un archivo a manera de prueba: es decir archivos ficticios con datos ficticios.

Este artículo fue mi primer "bebé" que me llevó casi una mañana completa pues tuve que leer algunos libros y tutoriales sobre PLSQL.

El plantemiento es el siguiente:

Tengo una tabla creada que esta completamente validada por lo que no existen valores fuera de rango. Aprovechando que es número considerable de registros lo que se me ocurrió hacer es que les introduciría datos alatorios fuera de rango en registros aleatorios de la tabla.

Lo primero es ver como obtener números aleatorios en PL-SQL y buscando en páginas y tutos me encontré con la siguiente instrucción:

Como podemos observar en el anterior bloque anónimo, la forma de obtener los número es por medio de la tabla dual utilizando la función DBMS_RANDOM.VALUE(li,ls), donde li y ls son los límites de los números que se generarán, aquí son números del 1 al 10, generados 10 veces.

Podemos observar que los arroja con punto decimal, pensando en valores enteros, investigue la función TRUNC que elimina la parte decimal.

SELECT TRUNC(DBMS_RANDOM.VALUE(LI,LS)) INTO variable FROM dual;


Pensé pues que estaba resuelto, mando los valores aleatorios que quiero generar (sus límites), la variable a afectar y que genere un número físico que correspondiera con el registro (pensando en nuestro querido FoxPro, la instrucción GO), pero esto no es tan fácil en PLSQL, de hecho no encontré la solución.

Como buen programador de la vieja guardia pensé en otro camino. UPDATE solo se puede usar cuando tenemos las llaves del registro que se quiere afectar. Entonces busque hacer una subconsulta, cursor, vista, arreglo o lo que sea  de nuestra tabla que queremos afectar extraemos sus campos llaves y lo guardamos para su posterior consulta, las tablas no tienen un índice numérico pero los arreglos si, y me encontré esto en un libro.

CURSOR c_llaves IS
SELECT control, viv_sel FROM TVIVIENDA;
TYPE tLlaves IS TABLE OF c_llaves%ROWTYPE;
vLlaves tLlaves;


Primero se define un cursor llamado c_llaves que nos trae todas las llaves de la tabla a afectar. Luego se define un tipo tLlaves que es una tabla del ROWTYPE del cursor que se define antes, para después crear una variable de ese tipo.

Voy a detallar aquí lo que hago:

Escribí un procedimiento almacenado que recibe los límites de los valores aleatorios a generar , y cuantos queremos afectar con estás "inyecciones de valores"

create or replace PROCEDURE PROC_INSERTA_VALS_FUERADERANGO
(
PLI IN NUMBER
, PLS IN NUMBER
, PNUM IN NUMBER
)

Luego definimos el cursor, su tipo y variable relacionada, junto con otras variables que utilizaremos.

AS
CURSOR c_llaves IS
SELECT control, viv_sel FROM TVIVIENDA;
TYPE tLlaves IS TABLE OF c_llaves%ROWTYPE;
vLlaves tLlaves;
v_valInsertar NUMBER;
v_indice NUMBER;
v_tope NUMBER;

Lo primero es realizar la consulta y dejarla en la variable de tipo c_llave (vLlaves), como es conjunto de registros el INTO es BULK COLLECT INTO.

SELECT control, viv_sel BULK COLLECT INTO vLlaves FROM TVIVIENDA;

Despues indago cuantos registros tiene la tabla a afectar y lo guardo en v_tope.

SELECT COUNT(*) INTO v_tope FROM TVIVIENDA;

Posteriormente se hace el ciclo referente al número de registros a afectar. Se generan 2 números aleatorios, uno es el valor a insertar (v_valInsertar) y otro el índice (v_indice) correspondiente al arreglo vLlaves, uno se genera con los límites enviados por el usuario y el otro sería del registro 1 al v_tope que es el total de registros de la tabla. Para actualizar el valor (v_valInsertar) usamos la instrucción UPDATE, y para saber que registro, recurrimos al arreglo vLlaves con el índice generado aleatoriamente para rescatar sus dos valores llave. Aquí el código completo del procedimiento almacenado:

Todavía faltan muchas cosas para hacerlo más operativo, mandar el nombre de la tabla, el nombre del campo, y la inserción de campos alfabéticos, pero este procedimiento pudiera ser el inicio de todo.

Profesor Enrique Nash.


Tags: Oracle 11g, PL SQL, SqlDeveloper

Publicado por neofito69 @ 10:36  | Base de datos
Comentarios (0)  | Enviar
Comentarios