2017-08-21 6 views
1

Je veux créer une fonction qui accepte le paramètre d'entrée comme ci-dessous:Fonction mettre à jour les enregistrements de JSON dans Postgres

[ 
    { 
     "id": 1, 
     "organization_name": "Test Solutions", 
     "website": "[www..test.solutions]", 
     "contact_person": "John Doe" 
    } 
] 

je peux mettre à jour les enregistrements de la simple requête dans pgAdminIII il ne m'a pas donné n'importe quelle erreur mais il n'y a aucun autre moyen d'utiliser cette requête autre que la fonction dans JPA qui prendra une entrée dans une requête. Ci-dessous est ma requête de mise à jour:

UPDATE organization p 
    SET (organization_name,emails,contacts,relation_type_id,website,cst_no,vat_tin_no,contact_person)= 
    (COALESCE(ab.organization_name, p.organization_name) 
    ,COALESCE(ab.website, p.website) 
    ,COALESCE(ab.contact_person, p.contact_person) 
     ) 
    FROM (
     select * from json_populate_recordset 
    (null::organization,'[{"id":1,"organization_name":"Test Solutions","website":"[www..test.solutions]","contact_person":"John Doe"}]') 
    ) ab 
    WHERE p.id = ab.id; 

Comment puis-je créer une fonction JPA qui travaillera en passant JSON comme indiqué ci-dessus:

J'ai essayé une fonction qui me donne l'erreur que je passe le paramètre. est inférieure à la syntaxe de la fonction:

CREATE OR REPLACE FUNCTION cloudschema.org_bulk_edit_json(IN j json)RETURNS SETOF record AS 
$BODY$ 
BEGIN 

    UPDATE cloudschema.organization p 
    SET (organization_name,emails,contacts,relation_type_id,website,cst_no,vat_tin_no,contact_person)= 
    (COALESCE(ab.organization_name, p.organization_name) 
    ,COALESCE(ab.website, p.website) 
    ,COALESCE(ab.contact_person, p.contact_person) 
     ) 
    FROM (
     select * from json_populate_recordset 
    (null::cloudschema.organization,$1) 
    ) ab 
    WHERE p.id = ab.id; 
    END; 
    $BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100 
    ROWS 1000; 
+0

Quelle est l'erreur que vous obtenez et comment appelez-vous exactement votre fonction? –

Répondre

1

Votre requête (et la fonction) ne peut pas fonctionner parce que le nombre de colonnes ne correspond pas à nombre de valeurs. En outre, la fonction ne renvoie rien, elle doit donc être déclarée RETURNS void.

CREATE OR REPLACE FUNCTION cloudschema.org_bulk_edit_json(IN j json) 
RETURNS void AS 
$BODY$ 
BEGIN 
    UPDATE cloudschema.organization p 
    SET (organization_name, website, contact_person) = 
    (
     COALESCE(ab.organization_name, p.organization_name), 
     COALESCE(ab.website, p.website), 
     COALESCE(ab.contact_person, p.contact_person) 
    ) 
    FROM json_populate_recordset(null::cloudschema.organization,$1) ab 
    WHERE p.id = ab.id; 
END; 
$BODY$ 
LANGUAGE plpgsql VOLATILE; 

Si vous souhaitez mettre à jour plusieurs colonnes, ajouter des valeurs appropriées dans SET, .: par exemple

SET (organization_name, emails, contacts, website, contact_person) = 
    (
     COALESCE(ab.organization_name, p.organization_name), 
     COALESCE(ab.emails, p.emails), 
     COALESCE(ab.contacts, p.contacts), 
     COALESCE(ab.website, p.website), 
     COALESCE(ab.contact_person, p.contact_person) 
    )