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;
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top