Veamos un ejemplo de sobrecarga de subprogramas en el que una misma función es sobrecargada tres veces para diferentes tipos de parámetros.
DECLARE
TYPE agente IS agentes%ROWTYPE;
TYPE familia IS familias%ROWTYPE;
TYPE tAgentes IS TABLE OF agente;
TYPE tFamilias IS TABLE OF familia;
FUNCTION inserta_familia( mi_familia familia )
RETURN NUMBER IS
BEGIN
INSERT INTO familias VALUES (mi_familia.identificador, mi_familia.nombre, mi_familia.familia, mi_familia.oficina );
COMMIT;
RETURN 0;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
ROLLBACK;
RETURN –1;
WHEN OTHERS THEN
ROLLBACK;
RETURN SQLCODE;
END inserta_familia;
FUNCTION inserta_familia( mi_familia familia, hijas tFamilias )
RETURN NUMBER IS
BEGIN
INSERT INTO familias VALUES (mi_famila.identificador, mi_familia.nombre, mi_familia.familia, mi_familia.oficina );
IF (hijas IS NOT NULL) THEN
FOR i IN 1..hijas.COUNT LOOP
IF (hijas(i).oficina IS NOT NULL) or (hijas(i).familia ¡= mi_familia.identificador) THEN
ROLLBACK;
RETURN –1;
END IF;
INSERT INTO familias VALUES (hijas(i).identificador, hijas(i).nombre, hijas(i).familia, hijas(i).oficina );
END LOOP;
END IF;
COMMIT;
RETURN 0;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
ROLLBACK;
RETURN –1;
WHEN OTHERS THEN
ROLLBACK;
RETURN –1;
END inserta_familia;
FUNCTION inserta_familia( mi_familia familia, hijos tAgentes )
RETURN NUMBER IS
BEGIN
INSERT INTO familias VALUES (mi_familia.identificador, mi_familia.nombre, mi_familia.familia, mi_familia.oficina );
IF (hijos IS NOT NULL) THEN
FOR i IN 1..hijos.COUNT LOOP
IF (hijos(i).oficina IS NOT NULL) or (hijos(i).familia ¡= mi_familia.identificador) THEN
ROLLBACK;
RETURN –1;
END IF;
INSERT INTO agentes VALUES (hijos(i).identificador, hijos(i).nombre, hijos(i).usuario, hijos(i).clave, hijos(i).habilidad, hijos(i).categoria, hijos(i).familia, hijos(i).oficina );
END LOOP;
END IF;
COMMIT;
RETURN 0;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
ROLLBACK;
RETURN –1;
WHEN OTHERS THEN
ROLLBACK;
RETURN –1;
END inserta_familias;
mi_familia familia;
mi_familia1 familia;
familias_hijas tFamilias;
mi_familia2 familia;
hijos tAgentes;
BEGIN
...
resultado := inserta_familia(mi_familia);
...
resultado := inserta_familia(mi_familia1, familias_hijas);
...
resultado := inserta_familia(mi_familia2, hijos);
...
END;