2017-05-04 2 views
2

Disons que j'écris un script PSQL Postgres dans lequel je vais chercher une variable rowtype de la DB:Mise à jour d'une ligne à l'aide d'une variable ROWTYPE dans Postgres

DECLARE  
    m_bal Balances%ROWTYPE; 

BEGIN 
    SELECT INTO m_bal * 
    FROM Balances 
    WHERE Balances.id = m_acct.id AND Balances.currency = _currency; 
... 

et je souhaite mettre à jour un ou plus de valeurs en fonction de la logique plus complexe et l'enregistrer dans la base de données:

UPDATE Balances 
SET ROW = m_bal 
WHERE id = m_bal.id; 

que cela ne fonctionne pas et je suis nulle part après une heure de googler, je reçois une idée générale que Postgres n » t soutenir cela, mais avoir une réponse définitive "non" serait également bien.

Répondre

2

Désolé, mais cela ne fonctionnera pas.

Bien que vous puissiez utiliser des références de ligne entière dans les listes SELECT, UPDATE autorise uniquement les noms de colonne ou les listes de colonnes parenthisées dans la clause SET.

0

Pas toute la ligne, mais vous pouvez mettre à jour chaque colonne séparément (comme d'habitude mettre à jour, quelque chose comme ça):

create table test(
col1 text, 
col2 int 
); 

insert into test 
values 
('asd4', 4), 
('asd5', 5), 
('asd6', 6) ; 


do $$ 
declare 
    m_bal test%ROWTYPE; 
begin 
    SELECT INTO m_bal * 
    FROM test 
    WHERE test.col2 = 5; 

    UPDATE test 
    SET 
    col1 = m_bal.col1, 
    col2 = m_bal.col2 
    WHERE col2 = 6; 
end; 
$$ language plpgsql