Comportement générique dans les paramètres de procédure PL / SQL
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;
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