Re: Function PostgreSQL 9.2

From: Berend Tober <btober(at)computer(dot)org>
To: "drum(dot)lucas(at)gmail(dot)com" <drum(dot)lucas(at)gmail(dot)com>
Cc: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>, Melvin Davidson <melvin6925(at)gmail(dot)com>, Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>, Postgres General <pgsql-general(at)postgresql(dot)org>
Subject: Re: Function PostgreSQL 9.2
Date: 2016-05-05 07:40:57
Message-ID: 572AF909.8090404@computer.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

drum(dot)lucas(at)gmail(dot)com wrote:
> I'm just having some problem when doing:
>
> INSERT INTO public.users
> (id,email,encrypted_password,sign_in_count,created_at,updated_at,company_id) VALUES
> (66,'test22(at)test(dot)com <mailto:test22(at)test(dot)com>','password','0','2016-05-03 00:01:01','2016-05-03
> 00:01:01','15');
>
>
> - see that I'm not providing the "code" column value? If I run the query above, I get the following
> error:
>
> ERROR: query returned no rows
> CONTEXT: PL/pgSQL function users_code_seq() line 7 at SQL statement
>
>
> - If I include the code column with a default value:
>
> INSERT INTO public.users
> (id,email,encrypted_password,sign_in_count,created_at,updated_at,code,company_id) VALUES
> (4,'test4(at)test(dot)com <mailto:test4(at)test(dot)com>','password','0','2016-05-03 00:01:01','2016-05-03
> 00:01:01',default,'2');
>
> I get the same error
>
> - Please, if anyone can help with that.. I'd appreciate it.
>
> *The final function code is:*
>
> CREATE OR REPLACE FUNCTION users_code_seq()
> RETURNS "trigger" AS $$
> DECLARE code character varying;
> BEGIN
> IF NEW.code IS NULL THEN
> SELECT client_code_increment INTO STRICT NEW.code FROM public.companies WHERE id =
> NEW.id ORDER BY client_code_increment DESC;

I am pretty sure the above line is wrong. NEW.id refers to users.id, not the companies.id. Also, the
implementation presents a potential race condition, e.g., if two different sessions attempt an
insert almost simultaneously.

> END IF;
> IF (TG_OP = 'INSERT') THEN
> UPDATE public.companies SET client_code_increment = (client_code_increment + 1) WHERE
> id = NEW.id;

Ditto w.r.t. NEW.id.

> END IF;
> RETURN NEW;
> END;
> $$ LANGUAGE plpgsql;

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message drum.lucas@gmail.com 2016-05-05 09:04:18 Re: Function PostgreSQL 9.2
Previous Message Jacob Scott 2016-05-05 06:52:47 Possible causes for "tuple concurrently updated" error