Supongamos que tengo una tabla y un conjunto de datos como sigue:
# 1. Éxito accidental con datos de prueba incorrectos
CREATE TABLE undead_type ( undead_id INTEGER PRIMARY KEY, undead_name VARCHAR2 (100) ) / BEGIN INSERT INTO undead_type (undead_id, undead_name) VALUES (1, 'Skeleton'); INSERT INTO undead_type (undead_id, undead_name) VALUES (2, 'Zombie'); INSERT INTO undead_type (undead_id, undead_name) VALUES (3, 'Ghoul'); INSERT INTO undead_type (undead_id, undead_name) VALUES (4, 'Wight'); INSERT INTO undead_type (undead_id, undead_name) VALUES (5, 'Wraith'); INSERT INTO undead_type (undead_id, undead_name) VALUES (6, 'Mohrg'); INSERT INTO undead_type (undead_id, undead_name) VALUES (7, 'Ghast'); INSERT INTO undead_type (undead_id, undead_name) VALUES (8, 'Mummy'); INSERT INTO undead_type (undead_id, undead_name) VALUES (9, 'Lich'); INSERT INTO undead_type (undead_id, undead_name) VALUES (10, 'Demilich'); INSERT INTO undead_type (undead_id, undead_name) VALUES (11, 'Vampire Spawn'); INSERT INTO undead_type (undead_id, undead_name) VALUES (12, 'Vampire'); INSERT INTO undead_type (undead_id, undead_name) VALUES (13, 'Allip'); COMMIT; END; /Y tengo que escribir un programa que produce la siguiente salida:
Undead en Orden Alfabético:
- Allip
- Demilich
- Ghast
- ...
DECLARE l_count INTEGER; l_name plch_animals.animal_name%TYPE; BEGIN DBMS_OUTPUT.put_line ('Animals in Alphabetical Order'); SELECT COUNT (*) INTO l_count FROM plch_animals; FOR indx IN 1 .. l_count LOOP SELECT animal_name INTO l_name FROM plch_animals WHERE animal_id = indx; DBMS_OUTPUT.put_line (l_name); END LOOP; END; /
# 2. Demasiado SQL, datos insuficientes
DECLARE TYPE undead_ids_t IS TABLE OF undead_type.undead_id%TYPE; l_undead_ids undead_ids_t; l_name undead_type.undead_name%TYPE; BEGIN DBMS_OUTPUT.put_line ('undead in Alphabetical Order'); SELECT undead_id BULK COLLECT INTO l_undead_ids FROM undead_type; FOR indx IN 1 .. l_undead_ids.COUNT LOOP SELECT undead_name INTO l_name FROM undead_type WHERE undead_id = indx; DBMS_OUTPUT.put_line (l_name); END LOOP; END; /
# 3. Vamos a pasarlo bien con las conexiones PL/SQL con colecciones
DECLARE TYPE undead_ids_t IS TABLE OF undead_type.undead_id%TYPE INDEX BY undead_type.undead_name%TYPE; l_undead_ids undead_ids_t; l_index undead_type.undead_name%TYPE; l_name undead_type.undead_name%TYPE; BEGIN DBMS_OUTPUT.put_line ('undeads in Alphabetical Order'); FOR rec IN ( SELECT * FROM undead_type ORDER BY undead_name DESC) LOOP l_undead_ids (rec.undead_name) := rec.undead_id; END LOOP; l_index := l_undead_ids.FIRST; WHILE l_index IS NOT NULL LOOP DBMS_OUTPUT.put_line (l_index); l_index := l_undead_ids.NEXT (l_index); END LOOP; END; /
#4. SQL Simple
SELECT undead_name FROM undead_type ORDER BY undead_name;No es mucho más simple que eso. Y si lo necesita dentro de PL / SQL
#5. PL/SQL Simple
BEGIN DBMS_OUTPUT.put_line ('undead in Alphabetical Order'); FOR rec IN (SELECT undead_name FROM undead_type ORDER BY undead_name) LOOP DBMS_OUTPUT.put_line (rec.undead_name); END LOOP; END;
Lecciones aprendidas
- Deje a SQL hacer el levantamiento de pesas, tanto como sea posible (no es que haya algo muy "pesado" para levantar en este ejercicio!)
- No sobre-complicar las cosas. Asegúrese de que sus datos de prueba tengan suficiente volumen y variedad para ejercer realmente su algoritmo.
- Si te encuentras pensando "¿tiene que ser tan complicado?", Casi con toda seguridad la respuesta es un resonante "No!" Y debe dar un paso atrás, desafiar sus suposiciones, y ver cómo se puede simplificar su código
No hay comentarios:
Publicar un comentario
Por favor deja tu comentario, es valioso.