-
Crear tabla
CREATE TABLE gruposMusicales ( id NUMBER PRIMARY KEY, nombre VARCHAR2(50), anyo_formacion NUMBER, num_discos NUMBER, num_premios NUMBER, pais VARCHAR2(50) );
2. Insertar datos
```sql
INSERT INTO gruposMusicales (id, nombre, anyo_formacion, num_discos, num_premios, pais) VALUES
(1, 'Queen', 1970, 15, 4, 'Reino Unido'),
(2, 'Soda Stereo', 1982, 7, 3, 'Argentina'),
(3, 'Maná', 1986, 9, 5, 'México'),
(4, 'Los Prisioneros', 1983, 6, 2, 'Chile'),
(5, 'La Oreja de Van Gogh', 1996, 8, 4, 'España');
```
3. Procedimiento para mostrar todos los registros
``` sql
CREATE OR REPLACE PROCEDURE mostrar_todos_grupos IS
BEGIN
FOR grupo IN (SELECT \* FROM gruposMusicales) LOOP
DBMS_OUTPUT.PUT_LINE(
'ID: ' || grupo.id || ', Nombre: ' || grupo.nombre ||
', Año Formación: ' || grupo.anyo_formacion || ', Discos: ' || grupo.num_discos ||
', Premios: ' || grupo.num_premios || ', País: ' || grupo.pais
);
END LOOP;
END;
/
```
4. Función: total de discos por año
``` sql
CREATE OR REPLACE FUNCTION total_discos_por_anyo(p_anyo NUMBER)
RETURN NUMBER IS
v_total NUMBER := 0;
BEGIN
SELECT COALESCE(SUM(num_discos), 0)
INTO v_total
FROM gruposMusicales
WHERE anyo_formacion = p_anyo;
RETURN v_total;
END;
/
```
5. Función: total de premios por país
``` sql
CREATE OR REPLACE FUNCTION total_premios_por_pais(p_pais VARCHAR2)
RETURN NUMBER IS
v_total NUMBER := 0;
BEGIN
SELECT COALESCE(SUM(num_premios), 0)
INTO v_total
FROM gruposMusicales
WHERE UPPER(pais) = UPPER(p_pais);
RETURN v_total;
END;
/
```
6. Script para ejecutar ambas funciones
``` sql
SET SERVEROUTPUT ON;
DECLARE
v_discos NUMBER;
v_premios NUMBER;
BEGIN
v_discos := total_discos_por_anyo(1982);
DBMS_OUTPUT.PUT_LINE('Total de discos (1982): ' || v_discos);
v_premios := total_premios_por_pais('España');
DBMS_OUTPUT.PUT_LINE('Total de premios (España): ' || v_premios);
END;
/ 7. Procedimiento: grupo más reciente
CREATE OR REPLACE PROCEDURE grupo_mas_reciente IS
v_nombre gruposMusicales.nombre%TYPE;
v_anyo gruposMusicales.anyo_formacion%TYPE;
BEGIN
SELECT nombre, anyo_formacion
INTO v_nombre, v_anyo
FROM gruposMusicales
WHERE anyo_formacion = (SELECT MAX(anyo_formacion) FROM gruposMusicales);
DBMS_OUTPUT.PUT_LINE('Grupo más reciente: ' || v_nombre || ' (' || v_anyo || ')');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No hay datos.');
END;
/- Procedimiento: grupo más antiguo
CREATE OR REPLACE PROCEDURE grupo_mas_antiguo IS
v_nombre gruposMusicales.nombre%TYPE;
v_anyo gruposMusicales.anyo_formacion%TYPE;
BEGIN
SELECT nombre, anyo_formacion
INTO v_nombre, v_anyo
FROM gruposMusicales
WHERE anyo_formacion = (SELECT MIN(anyo_formacion) FROM gruposMusicales);
DBMS_OUTPUT.PUT_LINE('Grupo más antiguo: ' || v_nombre || ' (' || v_anyo || ')');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No hay datos.');
END;
/- Procedimiento: grupo con más premios
CREATE OR REPLACE PROCEDURE grupo_con_mas_premios IS
v_nombre gruposMusicales.nombre%TYPE;
v_premios gruposMusicales.num_premios%TYPE;
BEGIN
SELECT nombre, num_premios
INTO v_nombre, v_premios
FROM gruposMusicales
WHERE num_premios = (SELECT MAX(num_premios) FROM gruposMusicales);
DBMS_OUTPUT.PUT_LINE('Grupo con más premios: ' || v_nombre || ' (' || v_premios || ' premios)');
END;
/- Procedimiento: grupo con menos premios
CREATE OR REPLACE PROCEDURE grupo_con_menos_premios IS
v_nombre gruposMusicales.nombre%TYPE;
v_premios gruposMusicales.num_premios%TYPE;
BEGIN
SELECT nombre, num_premios
INTO v_nombre, v_premios
FROM gruposMusicales
WHERE num_premios = (SELECT MIN(num_premios) FROM gruposMusicales);
DBMS_OUTPUT.PUT_LINE('Grupo con menos premios: ' || v_nombre || ' (' || v_premios || ' premios)');
END;
/- Función: media de año de formación
CREATE OR REPLACE FUNCTION media_anyo_formacion
RETURN NUMBER IS
v_media NUMBER;
BEGIN
SELECT AVG(anyo_formacion)
INTO v_media
FROM gruposMusicales;
RETURN ROUND(v_media, 2);
END;
/