Question

Supposons que certains types de données soient définis dans 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;

Puis-je écrire en tant que paramètre une procédure pouvant accepter tout type de données dérivé de TABLE (par exemple, un foo_table_t ou un bar_table_t )? La procédure n'a pas besoin de connaître les types de lignes de la table. Un exemple trivial:

PROCEDURE remove_last(some_table ...) IS
BEGIN
    some_table.DELETE(some_table.LAST);
END;
Était-ce utile?

La solution

Pas directement. Du guide du programmeur PL / SQL:

"Le paramètre réel et le paramètre formel correspondant doivent avoir des types de données compatibles."

PL / SQL effectue une conversion implicite des types de données de paramètres réels en types de données de paramètres formels. Vous pouvez donc passer une valeur numérique à une procédure qui souhaite une chaîne. Cela fonctionnerait, car vous pouvez effectuer une conversion implicite.

Le mieux que vous puissiez faire serait d'écrire des procédures surchargées:

PROCEDURE generic (foo IN OUT foo_t);

PROCEDURE generic (barre IN OUT bar_t);

Ensuite, vous pouvez appeler générique avec l'un ou l'autre type d'enregistrement. Cette perte d’attractivité est proportionnelle au nombre de types d’enregistrements à manipuler :-D

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top