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;