Saltar la navegación

Anexo V.- Sobrecarga de subprogramas.

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;