Sql void函数抛出“查询没有结果数据的目标”错误

Sql void函数抛出“查询没有结果数据的目标”错误,sql,postgresql,Sql,Postgresql,我有一个包含整个函数的void return type函数: CREATE OR REPLACE FUNCTION insert_avg_prices(p_county character varying, p_municipality character varying, p_district character varying, p_neighbourhood character varying, p_street character varying, p_number character

我有一个包含整个函数的void return type函数:

CREATE OR REPLACE FUNCTION insert_avg_prices(p_county character varying, p_municipality character varying, p_district character varying, p_neighbourhood character varying, p_street character varying, p_number character varying, p_avg_rent decimal, p_avg_sale decimal)
 RETURNS VOID AS
$BODY$
DECLARE
    _precint_id integer;
    _city_id integer;
    _parish_id integer;
    _county_id integer;

    _address_id integer;

BEGIN
    SELECT place_precint.precint_id INTO _precint_id FROM place_precint WHERE place_precint.name = p_neighbourhood;
    SELECT place_city.city_id INTO _city_id FROM place_city WHERE place_city.name = p_district;
    SELECT place_parish.parish_id INTO _parish_id FROM place_parish WHERE place_parish.name = p_municipality;
    SELECT place_county.county_id INTO _county_id FROM place_county WHERE place_county.name = p_county;

    SELECT full_addresses.f_address_id FROM full_addresses 
    WHERE  full_addresses.county_id = _county_id AND
           full_addresses.parish_id = _parish_id AND
           full_addresses.city_id = _city_id AND
           full_addresses.precint_id = _precint_id AND
           full_addresses.street_name = p_street AND
           full_addresses.number = p_number;

    IF _address_id IS NULL THEN
        INSERT INTO full_addresses(f_address_id,
                     county_id,
                     parish_id,
                     city_id,
                     precint_id,
                     street_name,
                     number)
        VALUES (nextval('full_addresses_f_address_id_seq'),
            _county_id,
            _parish_id,
            _city_id,
            _precint_id,
            p_street,
            p_number);

        SELECT currval('full_addresses_f_address_id_seq') INTO _address_id;
    END IF;

    INSERT INTO building_prices(building_id, 
                    address_id, 
                    avg_sau_sale_price, 
                    avg_sau_rent_price) 
    VALUES (nextval('building_prices_building_id_seq'),
        _address_id,
        p_avg_sale,
        p_avg_rent);
    RETURN;
END;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
如果我用如下select语句调用它:

SELECT insert_avg_prices(...);
我得到一个错误:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function insert_avg_prices(character varying,character varying,character varying,character varying,character varying,character varying,numeric,numeric) line 16 at SQL statement
********** Error **********

ERROR: query has no destination for result data
SQL state: 42601
Hint: If you want to discard the results of a SELECT, use PERFORM instead.

CREATEFUNCTION语句没有错误。如何使其工作?

在函数中有一个SELECT语句,但该语句没有地方放置其数据

如果是,则使用INTO子句将结果存储在局部变量中以进行处理 如果语句返回多行,请使用或的选项之一。 显然,错误在这里:

SELECT full_addresses.f_address_id FROM full_addresses WHERE ...
应该是哪一个

SELECT full_addresses.f_address_id INTO _address_id FROM full_addresses WHERE ...

注意PL/PGSQL是一种解释性语言,这意味着函数体不会像编译Pascal或C++的编译程序语言那样被评估。因此,您可以编写一个只在调用时才显示任何错误的函数。

这没有意义-即使在函数调用级别,为什么您会有一个函数在select中返回void?在任何情况下,许多错误只有在实际执行相关函数时才会出现——很明显,函数中的某个地方有一个select,它不会将结果存储在变量/参数中。此外,我还避免在函数中使用副作用作为一般规则。这太痛苦了。如果你要迁移到Postgres,你真的很想知道Postgres与你来自的地方有什么不同。这个错误是由函数中的一个命令引起的。显示整个函数体。请编辑问题下方的灰色链接以显示函数体。包括整个函数