Définir la table et les noms de colonnes comme arguments dans une fonction plpgsql?
Il doit être simple, mais je suis en train de faire mes premiers pas dans Postgres fonctions et je ne peux pas trouver quelque chose qui fonctionne...
J'aimerais créer une fonction qui va modifier un tableau et /ou de la colonne et je ne peux pas trouver la bonne façon de spécifier mes tables et des colonnes comme arguments dans ma fonction.
Quelque chose comme:
CREATE OR REPLACE FUNCTION foo(t table)
RETURNS void AS $$
BEGIN
alter table t add column c1 varchar(20);
alter table t add column c2 varchar(20);
alter table t add column c3 varchar(20);
alter table t add column c4 varchar(20);
END;
$$ LANGUAGE PLPGSQL;
select foo(some_table)
Dans un autre cas, j'aimerais avoir une fonction qui modifie un certain colonne à partir d'un certain tableau:
CREATE OR REPLACE FUNCTION foo(t table, c column)
RETURNS void AS $$
BEGIN
UPDATE t SET c = "This is a test";
END;
$$ LANGUAGE PLPGSQL;
Est-il possible de faire cela?
Jetez un oeil à ce post.
OriginalL'auteur fgcartographix | 2013-08-22
Vous devez vous connecter pour publier un commentaire.
Vous devez défendre contre de l'injection SQL chaque fois que vous tournez la saisie de l'utilisateur dans le code. Qui comprend les noms de table et colonne venant de système de catalogues ou de saisie directe par l'utilisateur comme. De cette façon, vous prévenir aussi trivial exceptions non-standard identifiants. Il existe essentiellement trois des méthodes intégrées:
1.
format()
1er requête, aseptisé:
format()
nécessite Postgres 9.1 ou version ultérieure. À utiliser avec le%I
spécificateur de format.Le nom de la table peut être ambigu. Vous pouvez avoir à fournir le nom de schéma pour éviter de changer la mauvaise table par accident. Connexes:
De côté: l'ajout de plusieurs colonnes avec un
ALTER TABLE
commande est moins cher.2.
regclass
Vous pouvez également utiliser un plâtre pour une classe enregistrée (
regclass
) pour le cas particulier de existant les noms de table. Éventuellement schéma qualifiés. Cette échoue immédiatement et gracieusement pour les noms de table qui ne sont pas valides et visible à l'utilisateur appelant. Le 1er requête désinfectés à l'aide d'un plâtre pourregclass
:Appel:
Ou:
De côté: pensez à utiliser juste
texte
au lieu devarchar(20)
.3.
quote_ident()
La 2ème requête désinfectés:
Pour de multiples enchaînements /interpolations,
format()
est plus propre ...Réponses:
Sensible à la casse!
Être conscient que les identificateurs non cotées sont pas exprimés en minuscules ici. Lorsqu'il est utilisé comme identificateur SQL Postgres jette à bas de casse automatiquement. Mais ici nous passons chaînes pour SQL dynamique. Lors de l'échappée comme l'a démontré, à dos de Chameau cas, les identifiants (comme
UserS
) sera conservé par doublequoting ("UserS"
), tout comme les autres non-standard des noms comme"name with space"
"SELECT"
etc. Par conséquent, les noms sont sensibles à la casse dans ce contexte.Mon conseil est d'utiliser juridiques minuscules identificateurs exclusivement et ne vous inquiétez pas à ce sujet.
De côté: les guillemets simples pour les valeurs, les guillemets doubles pour les identificateurs.
OriginalL'auteur Erwin Brandstetter