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 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 PL / PGSQL CODE> qui accepte une fonction de rappel comme paramètre? P>
code>. Mais peut-être que je manque quelque chose? P>
4 Réponses :
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. P>
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 || '()' ... code>.
Plus d'informations ici - Postgresql.org/docs /9.1/statique/...
É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 Identifier la fonction et le transmettre n'est pas un problème: P> REGPROC code> et
REGPROCEDURE CODE> avec le moulages associés pour une manipulation plus facile. Recherchez le manuel pour ceux-ci. P>
select 'pg_database_size(oid)'::regprocedure; -- create "reference"
regprocedure
-----------------------
pg_database_size(oid)
Vous devez construire SQL dynamique et utiliser Exécuter dans une fonction PLPGSQL. CAST REGPROC CODE> Retour à
Texte CODE> Pour créer la chaîne de requête. Assurez-vous de protéger contre SQLI avec
Quote_ident () Code> - 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; Code>
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';
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; code>
- Créez une fonction paramétré.
select * from func_func('select1()');