Saltar la navegación

Anexo IV.- Paso de parámetros a subprogramas.

Veamos algunos ejemplos del paso de parámetros a subprogramas:

  • Notación mixta.
    DECLARE
         PROCEDURE prueba( formal1 NUMBER, formal2 VARCHAR2) IS
         BEGIN
              ...
         END;
         actual1 NUMBER;
         actual2 VARCHAR2;
    BEGIN
         ...
         prueba(actual1, actual2);               --posicional
         prueba(formal2=>actual2,formal1=>actual1);     --nombrada
         prueba(actual1, formal2=>actual2);          --mixta
    END;
    
    
  • Parámetros de entrada.
    FUNCTION categoria( id_agente IN NUMBER ) 
    RETURN NUMBER IS
         cat NUMBER;
    BEGIN
         ...
         SELECT categoria INTO cat FROM agentes 
    WHERE identificador = id_agente;
    RETURN cat;
    EXCEPTION
         WHEN NO_DATA_FOUND THEN
              id_agente := -1; --ilegal, parámetro de entrada
    END;


  • Parámetros de salida.
    PROCEDURE nombre( id_agente NUMBER, nombre OUT VARCHAR2) IS
    BEGIN
         IF (nombre = 'LUIS') THEN     --error de sintaxis
         END IF;
         ...
    END;
    
    
  • Parámetros con valor por defecto de los que podemos prescindir.
    DECLARE 
         SUBTYPE familia IS familias%ROWTYPE;
         SUBTYPE agente IS agentes%ROWTYPE;
         SUBTYPE tabla_agentes IS TABLE OF agente;
         familia1 familia;
         familia2 familia;
         hijos_fam tabla_agentes;
         FUNCTION inserta_familia( mi_familia familia, 
              mis_agentes tabla_agentes := tabla_agentes() ) 
    RETURN NUMBER IS
         BEGIN
              INSERT INTO familias VALUES (mi_familia);
              FOR i IN 1..mis_agentes.COUNT LOOP
                   IF (mis_agentes(i).oficina IS NOT NULL) or (mis_agentes(i).familia ¡= mi_familia.identificador) THEN
                        ROLLBACK;
                        RETURN –1;
                   END IF;
                   INSERT INTO agentes VALUES (mis_agentes(i));
              END LOOP;
              COMMIT;
              RETURN 0;
         EXCEPTION
              WHEN DUP_VAL_ON_INDEX THEN
                   ROLLABACK;
                   RETURN –1;
              WHEN OTHERS THEN
                   ROLLBACK;
                   RETURN SQLCODE;
         END inserta_familia;
    BEGIN
         ...
         resultado := inserta_familia( familia1 );
         ...
         resultado := inserta_familia( familia2, hijos_fam2 );
         ...
    END;