EXÉCUTER...DANS...à l'AIDE de déclaration en PL/pgSQL ne peut pas s'exécuter dans un dossier?
Je suis d'essayer d'écrire un domaine d'une fonction PL/pgSQL qui parcourt un hstore
et établit un record de la colonne(la clé de la hstore
) à une valeur spécifique (la valeur de la hstore
). J'utilise Postgres 9.1.
La hstore
ressemblera: ' "column1"=>"value1","column2"=>"value2" '
Généralement, voici ce que je veux à partir d'une fonction qui prend un hstore
et a un dossier avec des valeurs à modifier:
FOR my_key, my_value IN
SELECT key,
value
FROM EACH( in_hstore )
LOOP
EXECUTE 'SELECT $1'
INTO my_row.my_key
USING my_value;
END LOOP;
L'erreur que j'obtiens avec ce code:
"myrow" has no field "my_key"
. J'ai cherché pendant un bon moment maintenant une solution, mais tout le reste j'ai essayé d'obtenir le même résultat n'a pas fonctionné.
Vous devez vous connecter pour publier un commentaire.
Solution plus simple pour votre posté réponse. Doit effectuer beaucoup mieux.
Cette fonction récupère une ligne dans une table donnée (
in_table_name
) et de la valeur de la clé primaire (in_row_pk
), et l'insère comme nouvelle ligne dans la même table, avec quelques valeurs de remplacement (in_override_values
). La nouvelle valeur de clé primaire en tant que par défaut est retourné (pk_new
).Appel:
SQL Violon.
Utilisation
regclass
comme type de paramètre d'entrée, si seulement valide les noms de table peut être utilisé pour commencer avec, et l'injection SQL est exclue. De plus, la fonction échoue plus tôt et avec plus de grâce, si vous devez fournir illégale d'un nom de table.Utiliser un
OUT
paramètre (pk_new
) afin de simplifier la syntaxe.Pas besoin de comprendre la valeur suivante de la clé primaire manuellement. Il est inséré automatiquement et retourné après le fait. Ce n'est pas seulement plus simple et plus rapide, vous permet également d'éviter les pertes ou de numéros de séquence.
Utilisation
format()
pour simplifier l'assemblage de la dynamique de la chaîne de requête et de faire moins d'erreur. Notez la façon dont j'utilise les paramètres positionnels pour les identificateurs et les chaînes de caractères, respectivement.- Je construire sur votre implicite hypothèse qui a permis à des tables ont une seule colonne de clé primaire de type entier avec une colonne par défaut. Généralement
série
colonnes.Élément clé de la fonction est la dernière
INSERT
:#=
de l'opérateur dans une sous-sélection et décomposer le résultant de la ligne immédiatement.SELECT
.RETURNING
clause.OUT
paramètre directement.Car je ne voulais pas avoir à utiliser toutes les fonctions externes à des fins de vitesse, j'ai créé une solution à l'aide de hstores pour insérer un enregistrement dans une table:
C'est un peu plus longue que ce que j'avais prévu, mais il fonctionne et est en fait assez rapide.