Ссылка на столбец неоднозначна для локальной переменной в функции - PullRequest
0 голосов
/ 23 января 2019

Следующее является моей функцией

CREATE OR REPLACE FUNCTION  add_config_to_enterprise(configKey character varying, enterpriseValue character varying) RETURNS void AS 
$BODY$
DECLARE
entId character varying;
   BEGIN
        FOR entId IN
    SELECT enterprise_id
    FROM tenant
LOOP
    INSERT INTO enterprise_configuration(enterprise_configuration_id, product_configuration_id, enterprise_id, value)
SELECT *
FROM 
    (SELECT uuid_generate_v4(),
        (SELECT pc.product_configuration_id
        FROM product_configuration pc
        WHERE pc.configuration_key = configKey), 
            entId, enterpriseValue) AS tmp
            WHERE NOT EXISTS 
            (SELECT e.enterprise_configuration_id
            FROM enterprise_configuration e
            WHERE e.enterprise_id = entId AND e.product_configuration_id = 
                (SELECT p.product_configuration_id
                FROM product_configuration p
                WHERE p.configuration_key = configKey));

END LOOP;


   END;

$BODY$ LANGUAGE 'plpgsql'

Но она выдает мне следующую ошибку, когда эта функция вызывается

ERROR:  column reference "entid" is ambiguous
LINE 12:             WHERE e.enterprise_id = entId AND e.product_conf...
                                             ^
DETAIL:  It could refer to either a PL/pgSQL variable or a table column.

В любой таблице нет столбца с именем entid.Почему он дает такую ​​ошибку?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Проблема в том, что подзапрос с псевдонимом tmp, который вы определили в своем запросе, имеет столбец с именем entid, поэтому анализатор не знает, относится ли ссылка на entid в условии WHERE на этот столбец или переменную функции.

Правда, они содержат одно и то же значение, так что в действительности это не имеет значения, но все еще существует синтаксическая неоднозначность.

Вы должны квалифицировать entid в условии WHERE либо псевдонимом tmp, либо именем функции add_config_to_enterprise, чтобы устранить неоднозначность.

Ваш запрос излишне сложен и неоправдан, настолько, что я не могу его понять и улучшить. Упрощение этого избавит от проблемы.

0 голосов
/ 23 января 2019

Использовать псевдоним подзапроса в условии WHERE:

...
SELECT *
FROM 
    (SELECT uuid_generate_v4(),
        (SELECT pc.product_configuration_id
        FROM product_configuration pc
        WHERE pc.configuration_key = configKey), 
            entId, enterpriseValue) AS tmp
            WHERE NOT EXISTS 
            (SELECT e.enterprise_configuration_id
            FROM enterprise_configuration e
            WHERE e.enterprise_id = tmp.entId AND e.product_configuration_id = -- here
                (SELECT p.product_configuration_id
                FROM product_configuration p
                WHERE p.configuration_key = configKey));
...

или переименуйте entId в списке SELECT подзапроса:

...
SELECT *
FROM 
    (SELECT uuid_generate_v4(),
        (SELECT pc.product_configuration_id
        FROM product_configuration pc
        WHERE pc.configuration_key = configKey), 
            entId as eId, enterpriseValue) AS tmp -- here
            WHERE NOT EXISTS 
            (SELECT e.enterprise_configuration_id
            FROM enterprise_configuration e
            WHERE e.enterprise_id = entId AND e.product_configuration_id =
                (SELECT p.product_configuration_id
                FROM product_configuration p
                WHERE p.configuration_key = configKey));
...
...