Comportamiento genérico en parámetros de procedimiento PL / SQL
Pregunta
Suponga que tengo algunos tipos de datos definidos en PL / SQL:
TYPE foo_t IS RECORD (...);
TYPE foo_table_t IS TABLE OF foo_t INDEX BY BINARY_INTEGER;
TYPE bar_t IS RECORD (...);
TYPE bar_table_t IS TABLE OF bar_t INDEX BY BINARY_INTEGER;
¿Es posible para mí escribir un procedimiento capaz de aceptar cualquier tipo de datos derivados de TABLE (por ejemplo, un foo_table_t
o un bar_table_t
) como parámetro? El procedimiento no necesita conocer los tipos de fila de la tabla. Un ejemplo trivial:
PROCEDURE remove_last(some_table ...) IS
BEGIN
some_table.DELETE(some_table.LAST);
END;
Solución
No directamente. De la guía del programador PL / SQL:
" El parámetro real y su parámetro formal correspondiente deben tener tipos de datos compatibles. "
PL / SQL realiza una conversión implícita de tipos de datos de parámetros reales a tipos de datos de parámetros formales. Por lo tanto, podría pasar un valor numérico a un procedimiento que quiera una cadena, y funcionaría porque puede hacer una conversión implícita.
Lo mejor que podría hacer sería escribir procedimientos sobrecargados:
PROCEDIMIENTO genérico (foo IN OUT foo_t);
PROCEDIMIENTO genérico (bar IN OUT bar_t);
Entonces puede llamar genérico con cualquier tipo de registro. Esto pierde atractivo en proporción al número de tipos de registros a manejar :-D