0
votes

Impossible d'utiliser une variable déclarée dans DDL

S'il vous plaît considérer ci-dessous code simple xxx

sur l'exécution du code ci-dessus, je reçois une erreur xxx

pourquoi postgres ne reconnaît pas la variable déclarée DDL

Je ne veux pas utiliser exécuter pour effectuer une instruction entière dynamique.


0 commentaires

3 Réponses :


0
votes

Vous ne pouvez pas transmettre ceci comme paramètre de requête. Pour cela, vous avez besoin de SQL dynamique: xxx

Démo sur db violon


9 commentaires

En question, j'ai déjà mentionné que je ne veux pas utiliser exécuter . Cela fera ma déclaration complète dynamique. Je veux juste passer la taille comme variable.


@afzalex: J'ai peur que cela ne soit pas possible. Mais si vous n'aimez pas ma réponse, je peux le supprimer. Peut-être que quelqu'un d'autre va venir avec une autre solution ...


Savez-vous quelle est la raison de cela?


Je pense que c'est une requête dinamique comme dire dans la documentation, postgreSQL.org/docs/current/... et toujours, vous devez utiliser la clause d'exécution


@Antthonysotolongo à l'aide de l'exécution a ses propres inconvénients. Pensez que j'aurais pu utiliser cette variable pour insérer des données. Selon vous, je devrais utiliser l'exécution pour cela aussi. Le point est variable ne fonctionne pas uniquement dans DDL (ACC. À ma compréhension ici) et ma question est pourquoi est-ce le cas.


Les commandes DDL @afzalex n'ont pas été basées sur l'exécution du plan d'exécution. Sans plan d'exécution, il n'est pas possible de paramétrer ces commandes. Select et DML sont basés sur des plans d'exécution - et ces plans peuvent contenir des variables. DDL n'a pas de même - ne devrait pas avoir - car il existe absolument différent sémantique, puis une seule façon de faire "paramétrisation" utilise dynamique SQL Exécuter .


@PAVELSTEHULE Veuillez poster votre commentaire comme réponse. Je crois que c'est une explication adéquate pour la question. Y a-t-il une documentation officielle n'importe où qui explique cela?


@afzalex Il n'y a aucun moyen que vous puissiez faire cela sans SQL dynamique


@afzalex - J'ai écrit la réponse. Je ne suis pas sûr que cela se trouve quelque part dans la documentation des postgres - peut-être pas - je suis l'un des développeurs qui travaillent sur le développement de PLPGSQL Runtime (langue). Son détail de la mise en œuvre peut-être pas trop important pour le maire faisant partie des développeurs. Mais peut-être que c'est dans la documentation PLPGSQL - il y a longtemps que je le lis.



1
votes

Si vous utilisez PSQL, veuillez essayer:

\set a 1

CREATE TABLE a (a varchar(:a));


0 commentaires

1
votes

Postgres internes connaît deux types de commandes - Commandes ( Créer , alter , goutte ,.) et requêtes ( SELECT , insérer , mise à jour , Supprimer ). Chaque commande a une implémentation spéciale. Les requêtes sont implémentées avec des étapes: analyse, analysement, optimisation, exécution. Il y a une probabilité élevée afin que les requêtes soient exécutées à plusieurs reprises. Les commandes ne sont généralement pas exécutées plus de fois. Ensuite, les questions ont une optimisation spéciale pour un plan paramétré à exécution répété. Le plan est la séquence d'étapes de l'exécution de la requête. Habituellement, c'est la même chose, mais les paramètres (variables) sont différents - vous pouvez rechercher Pavel ou Tomas, vous pouvez insérer Pavel ou Tomas. Il n'y a rien de similaire pour les commandes.

Vous pouvez utiliser des variables PLPGSQL partout où il est possible d'utiliser des paramètres de plan. PLPGSQL Runtime Joinez-y. Et vous ne pouvez pas utiliser de variables d'autre où. Les instructions DDL (commandes n'a pas de plan), puis vous ne pouvez pas utiliser de variables là-bas. Une seule alternative est dynamique sql - exécutant la commande dans plpgsql.


0 commentaires