Que mejor diversión que programar un poco en tu tiempo libre no?
Definitivamente trae mucha felicidad...
Yo sin nada que hacer decidí hacer algo de arte. Vamos allá:
--- SCRIPT1:
SET SERVEROUTPUT ON /*para que se muestre en pantalla el resultado de la función "PUT_LINE" del paquete "DBMS_OUTPUT"*/ --STAGE ONE DECLARE -- declaro las variables que usare V_CANTIDAD NUMBER(2); V_PRINT_LINE VARCHAR2(100); BEGIN V_CANTIDAD := 10; -- inicializo mis variables FOR I IN 1..V_CANTIDAD LOOP -- mi bucle que genera las líneas V_PRINT_LINE := RPAD(' ',I,'@'); /*RPAD rellena a la derecha(agregamos la --cantidad de "I" veces el caracteres "@" a la derecha de "' '")*/ DBMS_OUTPUT.PUT_LINE(V_PRINT_LINE); /* muestro la variable: "V_PRINT_LINE" llenada con la instrucción anterior*/ END LOOP; FOR E IN REVERSE 1..V_CANTIDAD-1 LOOP /*bucle en reversa para generar las líneas hacia abajo*/ V_PRINT_LINE := RPAD(' ',E,'@'); DBMS_OUTPUT.PUT_LINE(V_PRINT_LINE); END LOOP; END;
---OUTPUT:
--- SCRIPT2:
--STAGE TWO -- figura anterior pero al revés
DECLARE
V_CANTIDAD NUMBER(2);
V_PRINT_LINE VARCHAR2(100);
V_COUNT NUMBER(2); -- entiendo que esta variable me facilita las cosas, por eso la declare
BEGIN
V_CANTIDAD := 10;
V_COUNT := 0;
FOR E IN REVERSE 1..V_CANTIDAD LOOP /*otro bucle en reversa para generar las líneas*/
V_COUNT := V_COUNT+1; -- esta variable aumenta, contrario a "I" que disminuye
V_PRINT_LINE := LPAD('@',E,'_')||RPAD('@',V_COUNT-1,'@');
/*en el paso anterior relleno la variable "V_PRINT_LINE": LPAD('@',e,'_') agrega el carácter: "_" la cantidad de "E" veces a
la izquierda del carácter "@"; y ||RPAD('@',v_count-1,'@') agrega la cantidad de "v_count-1" veces el carácter "@" a la derecha del carácter "@"*/
DBMS_OUTPUT.PUT_LINE(V_PRINT_LINE); -- muestra: "V_PRINT_LINE"
END LOOP;
---------------------
FOR E IN 1..V_CANTIDAD-1 LOOP -- bucle que genera las líneas hacia abajo
V_PRINT_LINE := LPAD('@',E+1,'_')||RPAD('@',(V_COUNT-E)-1,'@');
/*en paso anterior asigno el valor de la variable "V_PRINT_LINE": LPAD('@',E+1,'_') agrego "E+1" veces el carácter "_" a la izquierda del carácter "@"
y ||RPAD('@',(V_COUNT-E)-1,'@'); agrega "(V_COUNT-E)-1" veces el carácter "@" a la derecha del carácter "@"*/
DBMS_OUTPUT.PUT_LINE(V_PRINT_LINE);
END LOOP;
END;
---OUTPUT:
---SCRIPT3:
--STAGE THREE -- PIRAMIDE/CONO
DECLARE
V_CANTIDAD NUMBER(2);
V_PRINT_LINE VARCHAR2(100);
V_PRINT_LINE2 VARCHAR2(100); -- otra variable, también para facilitar el asunto
V_COUNT NUMBER(2);
BEGIN
V_CANTIDAD := 10;
V_COUNT := 0;
FOR E IN REVERSE 1..V_CANTIDAD LOOP -- otro LOOP en reversa
V_COUNT := V_COUNT+1;
V_PRINT_LINE := LPAD('@',E,'_')||RPAD('@',V_COUNT-1,'@'); /* explicado anteriormente...*/
V_PRINT_LINE2 := RPAD('@',V_COUNT-1,'@'); /*pude haberme ahorrado esta asignación, pero dividido en dos pasos es más intuitivo*/
DBMS_OUTPUT.PUT_LINE(V_PRINT_LINE||V_PRINT_LINE2); -- concateno con "||" las variables "V_PRINT_LINE" y "V_PRINT_LINE2"
END LOOP;
END;
---OUTPUT:
--STAGE FOUR --BARQUILLA/CONO
DECLARE
V_CANTIDAD NUMBER(2);
V_PRINT_LINE VARCHAR2(100);
V_PRINT_LINE2 VARCHAR2(100);
BEGIN
V_CANTIDAD := 10;
FOR E IN 1..V_CANTIDAD LOOP
V_PRINT_LINE := LPAD('@',E,'_')||RPAD('@',V_CANTIDAD-E,'@');
/*asigno a "V_PRINT_LINE" lo siguiente: LPAD('@',E,'_'): "_" es agregado "E" veces a la izquierda de "@" y lo concateno a:
RPAD('@',V_CANTIDAD-E,'@'): "@" es agregado "V_CANTIDAD-E" veces a la derecha de "@"*/
V_PRINT_LINE2 := RPAD('@',V_CANTIDAD-E,'@'); -- explicado en paso anterior
DBMS_OUTPUT.PUT_LINE(V_PRINT_LINE||V_PRINT_LINE2);
END LOOP;
END;
---OUTPUT:
--STAGE FIVE -- PIRAMIDE/CONO|--|BARQUILLA/CONO
DECLARE /* en este bloque tengo más de lo mismo con cierta diferencia en la lógica, por lo cual me ahorrare la explicación...*/
V_CANTIDAD NUMBER(2);
V_PRINT_LINE VARCHAR2(100);
V_PRINT_LINE2 VARCHAR2(100);
V_COUNT NUMBER(2);
BEGIN
V_CANTIDAD := 10;
V_COUNT := 0;
----------PIRAMIDE/CONO
FOR E IN REVERSE 1..V_CANTIDAD LOOP
V_COUNT := V_COUNT+1;
V_PRINT_LINE := LPAD('@',E,'_')||RPAD('#',V_COUNT-1,'0'); /*cambio los caracteres para así apreciar bien el proceso*/
V_PRINT_LINE2 := RPAD('8',V_COUNT-1,'+');
DBMS_OUTPUT.PUT_LINE(V_PRINT_LINE||V_PRINT_LINE2);
END LOOP;
----------BARQUILLA/CONO
FOR E IN 1..V_CANTIDAD-1 LOOP
V_PRINT_LINE := LPAD('+',E+1,'_')||RPAD('@',(V_CANTIDAD-1)-E,'='); /* igual aquí, cambio los caracteres para así apreciar bien el proceso*/
V_PRINT_LINE2 := RPAD('9',V_CANTIDAD-(E+1),'#');
DBMS_OUTPUT.PUT_LINE(V_PRINT_LINE||V_PRINT_LINE2);
END LOOP;
END;
---OUTPUT:
---E AQUÍ UN PLUS:
SET SERVEROUTPUT ON SET VERIFY OFF /*omito el código que generan las variables de sustitución*/ DECLARE V_DATE VARCHAR2(150); V_CANTIDAD INTEGER(2); V_MESSAGE VARCHAR2(100); E_WRONG_N EXCEPTION; /*exception definida por el usuario*/ PRAGMA EXCEPTION_INIT(E_WRONG_N, -06502); /*asocio mi exception con un error de ORACLE*/ BEGIN V_DATE := TO_CHAR(SYSDATE,'fmDAY DD" de "MONTH" del Año" YYYY, "Hora:" HH12:MI:SS PM', 'nls_date_language = Spanish'); /*en el paso anterior le asigno la fecha actual a la variable: "V_DATE" con un formato bonito:))*/ V_CANTIDAD := '&CANTIDAD'; /*e aquí una Variable de Sustitución(le pide al usuario que la introduzca)*/ IF V_CANTIDAD NOT BETWEEN 1 AND 15 THEN /*limito al usuario a introducir valore entre 1 y 15*/ RAISE E_WRONG_N; /*levanto mi exception si me introducen un valor fuera del rango*/ END IF; V_MESSAGE := 'LIFE IS THE MOST PRECIOUS GIFT YOU WILL EVER HAVE!!!'; /*un lindo mensaje*/ DBMS_OUTPUT.PUT_LINE(' '||V_MESSAGE);/*esas líneas son intencionales, por cuestiones de formato*/ FOR A IN 1..V_CANTIDAD LOOP DBMS_OUTPUT.PUT_LINE(LPAD(RPAD('%',A,'%'),V_CANTIDAD,'_')||RPAD('@',A,'@')); /*más de lo ya explicado pero sin variables*/ IF V_CANTIDAD = A THEN DBMS_OUTPUT.PUT_LINE('<<<<<SQUEEZE*IT>>>>>'); FOR I IN REVERSE 1..A LOOP DBMS_OUTPUT.PUT_LINE(LPAD(RPAD('@',I,'@'),V_CANTIDAD,'_')||LPAD('%',I,'%')); END LOOP; END IF; END LOOP; DBMS_OUTPUT.PUT_LINE('FECHA Y HORA ACTUAL: '||V_DATE); /*muestro la fecha*/ EXCEPTION WHEN E_WRONG_N THEN /*mi exception*/ DBMS_OUTPUT.PUT_LINE('LA CANTIDAD DEBE SER NUMÉRICA Y EN UN RANGO DE 1 A 15'); END;
---OUTPUT:
/*
De seguro todos estos procesos se pudieran hacer mucho más optimizados, pero el objetivo es solo mostrar lo potente y práctico que resulta PL/SQL.
*/