7
votes

Fonctionner comme paramètre à une autre fonction dans Postgres

Puis-je créer une fonction définie par l'utilisateur dans Postgres dans l'API de la fonction C-Langue ou à l'aide de PL / PGSQL qui accepte une fonction de rappel comme paramètre?

Autant que je vois, il n'y a aucun moyen de le faire à travers l'API de la langue C puisqu'elle accepte uniquement des fichiers de données SQL et il n'y a pas de type de données de type . Mais peut-être que je manque quelque chose?


0 commentaires

4 Réponses :


2
votes

Je pense que vous ne pouvez pas, mais comme il n'y a pas de fonctions anonymes, le nom de la fonction de passage devrait faire.


3 commentaires

Savez-vous comment j'appelle une fonction lorsque je n'ai que le nom de la fonction dans PL / PGSQL ou via l'API C?


@Kungi, quelque chose comme exécuter 'Select' || funcname || '()' ... .


Plus d'informations ici - Postgresql.org/docs /9.1/statique/...



4
votes

Étant donné que chaque fonction / procédure doit avoir une entrée dans pg_proc, vous pouvez utiliser la clé primaire pour identifier la procédure. Cela éliminerait également les problèmes liés aux procédures présentant le même nom, mais un nombre différent de paramètres ou de différents types de paramètres.

sténographie pour cela sont les types REGPROC code> et REGPROCEDURE CODE> avec le moulages associés pour une manipulation plus facile. Recherchez le manuel pour ceux-ci. P>

Identifier la fonction et le transmettre n'est pas un problème: P>

select 'pg_database_size(oid)'::regprocedure; -- create "reference"
     regprocedure      
-----------------------
 pg_database_size(oid)


1 commentaires

Vous devez construire SQL dynamique et utiliser Exécuter dans une fonction PLPGSQL. CAST REGPROC Retour à Texte Pour créer la chaîne de requête. Assurez-vous de protéger contre SQLI avec Quote_ident () - Les noms de fonction ne sont pas sûrs. Envisagez: créer une fonction "; Supprimer des utilisateurs;" () renvoie int comme "Sélectionnez 1" Langue SQL;



1
votes

Une ancienne question et a déjà une réponse acceptée. Mais cela n'explique pas clairement comment faire cela. Donc, j'ai pensé à ajouter une réponse plus claire.

Supposons que vous passez le nom de la fonction de rappel à votre fonction principale en tant que valeur de varchar. P>

EXECUTE 'create temp table if not exists temp_call as select * from ' || fn_name::regproc || '() limit 1';


1 commentaires

Sonting à RegProc, dans ce cas, uniquement pour valider la chaîne de «caractère variable» comme nom de fonction existant? Sinon, concaténer simplement le nom de la fonction comme une chaîne devrait aussi fonctionner, je pense que .... ... c'est-à-dire que cela fonctionne: créer une fonction g (_f_ varchar) renvoie comme $$ commencer à exécuter 'Select * de' || _f_ || '()'; RETOURNER ; Fin $$ langue PLPGSQL;



0
votes

- Créez une fonction paramétré.

select * from func_func('select1()');


0 commentaires