首页 > 解决方案 > Postgres sql函数没有给出正确的计数

问题描述

我正在使用下面的查询来检查下面的数据库中的数据计数是代码。

--- select "fn_delete_data"('7503','Test','ONE');
-- DROP FUNCTION fn_delete_data(character varying,character varying,character varying) 
CREATE OR REPLACE FUNCTION public."fn_delete_data"(
    IN IN_id character varying,
    IN IN_source character varying,
    IN IN_deletion_type character varying,
    OUT Out_message character varying,
    OUT Out_is_success INTEGER
)AS $$
DECLARE
    v_count integer := 0;
BEGIN
raise notice 'v_count %', v_count;
    CREATE TEMP TABLE "simple_count" ON COMMIT DROP AS(select * from public.client where "other_id" = IN_id
                UNION
                select * from public.client where "id" = IN_id);
                
    select count(*) INTO v_count from simple_count; 
    raise notice 'v_count %', v_count;
    IF (v_count > 0) THEN
        Out_is_success = 0;
        Out_message = 'Data Found. Not Allow to delete';
    ELSE
        Out_is_success = 1;
        Out_message = 'No Data found. Allow to delete';
    END IF;
END 
$$ LANGUAGE plpgsql;

我有 print v_count ,它给出了每次差异值。当我在函数外运行查询时,第一次打印给我 v_count 0 另一个打印给我每次 diff 计数,它给了我正确的 1 个计数。我不知道我做错了什么请帮忙。

标签: postgresqlpostgresql-9.3

解决方案


我认为问题出在您的临时表上ON COMMIT DROP,我认为它在创建自身后会自行删除,因为没有事务,因此您可以将函数简化为此并且它应该可以工作:

CREATE OR REPLACE FUNCTION public."fn_delete_data"(
    IN IN_id character varying,
    IN IN_source character varying,
    IN IN_deletion_type character varying,
    OUT Out_message character varying,
    OUT Out_is_success INTEGER
)AS $$
DECLARE
    v_count integer := 0;
BEGIN
    raise notice 'v_count %', v_count;
    select count(*) INTO v_count from public.client where IN_id in ("Id", "other_id"); 
    raise notice 'v_count %', v_count;
    IF (v_count > 0) THEN
        Out_is_success = 0;
        Out_message = 'Data Found. Not Allow to delete';
    ELSE
        Out_is_success = 1;
        Out_message = 'No Data found. Allow to delete';
    END IF;
END 
$$ LANGUAGE plpgsql;

推荐阅读