2017-05-05 2 views
0

Quelqu'un pourrait-il me signaler ce qui ne va pas avec le code suivant? Il ressemble à la syntaxe parfaitement légale, mais quand je le lance je reçois:Essayer de définir la variable à partir de la mise à jour ne fonctionne pas

ERROR: syntax error at or near "conctest" 
LINE 7: ret_id := (update conctest set id=id+1 where name = 'Billy ... 
         ^
********** Error ********** 

ERROR: syntax error at or near "conctest" 
SQL state: 42601 
Character: 66 

Code brisé:

DO $$ 

    declare ret_id integer; 

begin 

    ret_id := (update conctest set id=id+1 where name = 'Billy Bob' returning id); 

    DROP TABLE IF EXISTS tmpTable; 
    CREATE TEMPORARY TABLE tmpTable AS 
     select ret_id; 

END $$; 

select * from tmpTable; 

Cela fonctionne:

DO $$ 

    declare ret_id integer; 

begin 

    update conctest set id = id + 1 where name = 'Billy Bob'; 
    ret_id := (select id from conctest where name = 'Billy Bob'); 

    DROP TABLE IF EXISTS tmpTable; 
    CREATE TEMPORARY TABLE tmpTable AS 
     select ret_id; 

END $$; 

select * from tmpTable; 

Soit dit en passant, je copiais la mise à jour clause de la fenêtre de requête SQL de travail et ajouté manuellement " returning id" donc il n'y a pas de caractères étranges là-dedans. Qu'est-ce qui ne va pas?

TVMIA,

Adam.

Répondre

0

selon docs:

UPDATE ... expressions RETOURNER DANS cible [STRICT];

essayez d'utiliser à la place into:

t=# create table s111(i int); 
CREATE TABLE 
Time: 37.521 ms 
t=# insert into s111 select 1; 
INSERT 0 1 
Time: 1.016 ms 
t=# do 
$$ 
declare _i int; 
begin 
update s111 set i =2 returning i into _i; 
raise info '%',_i; 
end; 
$$ 
; 
INFO: 2 
DO 
Time: 0.944 ms 
+0

Merci, Vao - qui fonctionne. Je ne peux pas voir cette syntaxe sur https://www.postgresql.org/docs/current/static/sql-update.html. Je suppose que c'est sous-entendu "output_expression" mais toujours un peu ésotérique - si vous ne le savez pas, vous êtes dans le ruisseau. –

+0

fair point - J'ai ajouté un lien vers la documentation nécessaire. l'attribution de la valeur à la variable est la partie de plpgsql et votre lien est pour la commande de mise à jour de SQL –