Comportamento di tipo generico nei parametri di procedura PL / SQL
Domanda
Supponiamo di avere alcuni tipi di dati definiti in 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;
È possibile per me scrivere una procedura in grado di accettare qualsiasi tipo di dati derivato da TABELLA (ad esempio, foo_table_t
o bar_table_t
) come parametro? La procedura non ha bisogno di conoscenza dei tipi di riga della tabella. Un esempio banale:
PROCEDURE remove_last(some_table ...) IS
BEGIN
some_table.DELETE(some_table.LAST);
END;
Soluzione
Non direttamente. Dalla guida del programmatore PL / SQL:
" Il parametro effettivo e il corrispondente parametro formale devono avere tipi di dati compatibili. "
PL / SQL esegue una conversione implicita di tipi di dati dei parametri effettivi in ??tipi di dati dei parametri formali. Quindi, potresti passare un valore numerico a una procedura che richiede una stringa e funzionerebbe perché puoi fare una conversione implicita.
Il meglio che potresti fare sarebbe scrivere procedure sovraccariche:
PROCEDURA generica (foo IN OUT foo_t);
PROCEDURA generica (barra IN OUT bar_t);
Quindi puoi chiamare generico con entrambi i tipi di record. Questo perde attrattiva in proporzione al numero di tipi di record da gestire :-D