Názor ke článku PostgreSQL: PL/pgSQL – Serverové programování 01 od Pavel Stěhule - To ale není konflikt SQL identifikátoru a PLpgSQL...

  • 11. 11. 2016 5:28

    Pavel Stěhule

    To ale není konflikt SQL identifikátoru a PLpgSQL proměnné - jedná se o tzv zastínění proměnné - pro každý blok můžete deklarovat proměnné bez ohledu na vnější bloky a používá se proměnná z aktuálního bloku. PLpgSQL se chová správně.
    Nicméně toto chování může být pro programátora z jazyků, kde tato možnost není překvapivá, a proto je lze blokovat nebo si vynutit varování:

    SET plpgsql.extra_warnings TO 'shadowed_variables';
    
    CREATE FUNCTION foo(f1 int) RETURNS int AS $$
    DECLARE
    f1 int;
    BEGIN
    RETURN f1;
    END
    $$ LANGUAGE plpgsql;
    WARNING:  variable "f1" shadows a previously defined variable
    LINE 3: f1 int;
    
    SET plpgsql.extra_errors to 'shadowed_variables';
    create or replace function shadowtest(f1 int)
       returns boolean as $$
    declare f1 int; begin return 1; end $$ language plpgsql;
    ERROR:  variable "f1" shadows a previously defined variable
    LINE 3: declare f1 int; begin return 1; end $$ language plpgsql;

    https://www.postgresql.org/docs/9.5/static/plpgsql-development-tips.html