Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

127
Views
Insertar filas basadas en una matriz de UUID

Buscando una forma de insertar una lista de registros basada en una matriz de UUID. Aquí está mi código de ejemplo:

 CREATE OR REPLACE FUNCTION "AddGroupUsers" ( "@OrganizationID" UUID, "@GroupID" UUID, "@UserIDs" UUID[] ) RETURNS viud AS $func$ BEGIN FOR index IN "@UserIDs" LOOP INSERT INTO "UserGroups" ( "UserID", "GroupID", "OrganizationID" ) VALUES ( "@UserID"[index], "@GroupID", "@OrganizationID" ); END LOOP; END; $func$ LANGUAGE PLPGSQL;

Obviamente no funciona, jajaja.

Quiero poder llamar:

 SELECT "AddGroupUsers"( 'cb6e96db-73db-4b07-811f-c54b61d09fa4', '451a9ab7-02f6-4f63-bb87-80ad531ab490' array( '451a9ab7-02f6-4f63-bb87-80ad531ab490', '451a9ab7-02f6-4f63-bb87-80ad531ab491', '451a9ab7-02f6-4f63-bb87-80ad531ab492', '451a9ab7-02f6-4f63-bb87-80ad531ab493', '451a9ab7-02f6-4f63-bb87-80ad531ab494' )::uuid[] );

Como nota al margen, tengo una restricción de clave única que garantiza que solo exista un registro para un ID de usuario y un ID de grupo. Si el segundo valor de la matriz rompe esa regla, ¿fallará toda la consulta y cómo puedo ignorarla para asegurarme de que se inserten el resto de los valores?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Use unnest y sql simple en lugar de plpgsql. Con esta tabla:

 create table user_groups ( org_id uuid, grp_id uuid, use_id uuid, unique (grp_id, use_id) );

Esta función insertará inexistente:

 create or replace function AddGroupUsers( _org_id uuid, _grp_id uuid, _use_id uuid[] ) returns setof user_groups as $$ insert into user_groups (org_id, grp_id, use_id) select s.org_id, grp_id, use_id from ( select _org_id as org_id, _grp_id as grp_id, unnest(_use_id) as use_id ) s left join user_groups ug using (grp_id, use_id) where ug.grp_id is null returning * ; $$ language sql;

Uso:

 select * from AddGroupUsers( 'cb6e96db-73db-4b07-811f-c54b61d09fa4'::uuid, '451a9ab7-02f6-4f63-bb87-80ad531ab490'::uuid, array[ '451a9ab7-02f6-4f63-bb87-80ad531ab490', '451a9ab7-02f6-4f63-bb87-80ad531ab491', '451a9ab7-02f6-4f63-bb87-80ad531ab492', '451a9ab7-02f6-4f63-bb87-80ad531ab493', '451a9ab7-02f6-4f63-bb87-80ad531ab494' ]::uuid[] ); org_id | grp_id | use_id --------------------------------------+--------------------------------------+-------------------------------------- cb6e96db-73db-4b07-811f-c54b61d09fa4 | 451a9ab7-02f6-4f63-bb87-80ad531ab490 | 451a9ab7-02f6-4f63-bb87-80ad531ab490 cb6e96db-73db-4b07-811f-c54b61d09fa4 | 451a9ab7-02f6-4f63-bb87-80ad531ab490 | 451a9ab7-02f6-4f63-bb87-80ad531ab491 cb6e96db-73db-4b07-811f-c54b61d09fa4 | 451a9ab7-02f6-4f63-bb87-80ad531ab490 | 451a9ab7-02f6-4f63-bb87-80ad531ab492 cb6e96db-73db-4b07-811f-c54b61d09fa4 | 451a9ab7-02f6-4f63-bb87-80ad531ab490 | 451a9ab7-02f6-4f63-bb87-80ad531ab493 cb6e96db-73db-4b07-811f-c54b61d09fa4 | 451a9ab7-02f6-4f63-bb87-80ad531ab490 | 451a9ab7-02f6-4f63-bb87-80ad531ab494
over 4 years ago · Santiago Trujillo Report

0

Según esta respuesta y la documentación oficial , podría declare una variable para almacenar cada ID de usuario, así:

 CREATE OR REPLACE FUNCTION AddGroupUsers ( "@OrganizationID" UUID, "@GroupID" UUID, "@UserIDs" UUID[] ) RETURNS void AS $func$ DECLARE uID UUID; BEGIN FOREACH uID IN ARRAY "@UserIDs" LOOP INSERT INTO UserGroups ( UserID, GroupID, OrganizationID ) VALUES ( uID, "@GroupID", "@OrganizationID" ); END LOOP; END; $func$ LANGUAGE PLPGSQL;

Y para llamarlo realmente:

 SELECT AddGroupUsers( 'cb6e96db-73db-4b07-811f-c54b61d09fa4'::uuid, '451a9ab7-02f6-4f63-bb87-80ad531ab490'::uuid, array[ '451a9ab7-02f6-4f63-bb87-80ad531ab490', '451a9ab7-02f6-4f63-bb87-80ad531ab491', '451a9ab7-02f6-4f63-bb87-80ad531ab492', '451a9ab7-02f6-4f63-bb87-80ad531ab493', '451a9ab7-02f6-4f63-bb87-80ad531ab494' ]::uuid[] );

(Tenga en cuenta los corchetes en lugar de paréntesis)

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!