PostgreSQL - état SQL: 42601 erreur de syntaxe
Je voudrais savoir comment utiliser une requête dynamique à l'intérieur d'une fonction. J'ai essayé des tas de façons, cependant, lorsque j'essaie de compiler ma fonction d'un message SQL 42601 est affiché.
Le code que j'utilise:
CREATE OR REPLACE FUNCTION prc_tst_bulk(sql text)
RETURNS TABLE (name text, rowcount integer) AS
$$
BEGIN
WITH v_tb_person AS (return query execute sql)
select name, count(*) from v_tb_person where nome like '%a%' group by name
union
select name, count(*) from v_tb_person where gender = 1 group by name;
END
$$ LANGUAGE plpgsql;
D'erreur les messages que je reçois:
ERROR: syntax error at or near "return"
LINE 5: WITH v_tb_person AS (return query execute sql)
J'ai essayé d'utiliser:
WITH v_tb_person AS (execute sql)
WITH v_tb_person AS (query execute)
WITH v_tb_person AS (return query execute)
Quel est le problème? Comment puis-je résoudre ce problème?
Une question liée à PostgreSQL équivalent de l'Oracle “bulk collect”
- C'est clairement plpgsql de la syntaxe. Qu'est-ce que le
[Oracle]
balise fais ici? - Précédente question a propos de la traduction de PL/SQL vers PL/PgSQL, donc probablement porté que sur. J'ai enlevé l'étiquette.
- Une chose qui peut être bien la peine d'essayer de la documentation. Beaucoup d'efforts sont consacrés à l'PostgreSQL (et PL/PgSQL) de la documentation. Dans ce cas, vous aurez envie de commencer avec Dynamique des déclarations dans PL/PgSQL.
Vous devez vous connecter pour publier un commentaire.
Votre fonction fonctionne comme ceci:
Appel:
Vous ne pouvez pas mélanger la plaine et le SQL dynamique de la façon dont vous avez essayé de le faire. L'intégralité de la déclaration est dynamique ou de la totalité de la plaine SQL. Je suis donc de la construction d'une dynamique de déclaration à faire ce travail. Vous pouvez être intéressé dans le chapitre sur exécution de la dynamique des commandes dans le manuel.
La fonction d'agrégation
count()
retournebigint
, mais vous avez eurowcount
défini commeinteger
, si vous avez besoin d'un cast explicite::int
pour faire ce travail- Je utiliser dollar citant pour éviter citant l'enfer.
Cependant, est-ce censé être une pot de miel pour L'injection SQL attaques ou êtes-vous sérieusement allez l'utiliser? Pour votre très privé et sécurisé pour les utiliser, il pourrait être ok-ish - bien que je n'aurais pas confiance en moi-même avec une fonction comme ça. Si il n'y a aucun accès possible pour les utilisateurs non approuvés, une telle fonction est chargé footgun. Il est impossible de
faire de cette sécurisée.
Craig (un ennemi juré de l'injection SQL!) pourrait obtenir un peu de course, quand il voit ce que vous forgée à partir de son morceau de code dans la réponse à votre question précédente. 🙂
La requête elle-même semble plutôt bizarre, btw. Mais c'est à côté de la question ici.
SECURITY DEFINER
trop...