PostgreSQL:临时表的关系[临时表]不存在错误

时间:2018-03-08 08:04:20

标签: postgresql

我在PostgreSQL中有一个函数,它调用多个函数取决于某些条件。我使用“执行”语句动态地在main函数中创建一个临时表,并使用该临时表进行插入和选择  在其他函数中(使用“执行”语句的相同动态过程)我从main函数调用的那些函数。

但是,按照我的要求,它的工作正常。但有时它会在临时表上执行选择或插入子程序(内部函数)时抛出错误“关系不存在”。

样品

  • 主要功能

    CREATE OR REPLACE FUNCTION public.sample_function(
            param bigint)
            RETURNS TABLE(isfinished boolean)
            LANGUAGE 'plpgsql'
            COST 100.0
            VOLATILE     ROWS 1000.0
    AS $function$
        DECLARE
        st_dt DATE;
        end_dt DATE;
        var4 CHARACTER VARYING := CURRENT_TIME;
        var1 character varying;
    
    BEGIN
    
    SELECT SUBSTRING(REPLACE(REPLACE(REPLACE(var4,':',''),'.',''),'+','') FROM 5 FOR 7) INTO var4;
    
    EXECUTE 'CREATE TABLE sampletable'||var4||' ( 
        "emp_id" UUid,
        "emp_name" Character Varying( 2044 ),
        "start_date" Date,
        "end_date" Date)';
    
    
     select public.innerfunction (st_dt,end_dt,var4)
         into var1;
    
    
            EXECUTE 'DROP TABLE sampletable'||var4;
    
    return query select true ;
    
    END;
    

    - 内部功能

        CREATE OR REPLACE FUNCTION public.innerfunction(
        st_dt timestamp without time zone,
        end_dt timestamp without time zone,
        var4 bigint)
    
    RETURNS integer
          LANGUAGE 'plpgsql'
          COST 100.0
    
    VOLATILE
    
    AS $function$
    DECLARE
    
    date1 timestamp without time zone:=st_dt
    BEGIN
    
    EXECUTE 'INSERT INTO sampletable'||var4||' 
    SELECT *
    from "abc"'
    ;
    return return_val;
    END;
    
    $function$;
    

    - 错误讯息

    ERROR:  
    relation "sampletable1954209" does not exist
    LINE 1: INSERT INTO sampletable1954209 
    
    QUERY:  INSERT INTO sampletable1954209
    SELECT *
    from "abc"
    ;
    CONTEXT:  PL/pgSQL function innerfunction(timestamp without time zone, 
    timestamp without time zone) line 51 at EXECUTE
    SQL statement "SELECT public.innerfunction(st_dt ,end_dt)"
        PL/pgSQL function sample_function(bigint) line 105 at SQL statement
        ********** Error **********
    

在上面的示例中,我创建了一个主要功能' sample_function ',我正在创建一个临时动态表' sampletable ,并附加一个随机数。我在“内部功能”上使用该表进行插入。

当我调用主函数时,它按要求工作但有时会给出上述错误“ relation”sampletable1954209“不存在”。

我无法解决这个问题。

1 个答案:

答案 0 :(得分:0)

我发现此代码存在问题,但它与您的确切错误消息不完全匹配:

您将var4传递给innerfunction bigint

如果var40649940之类的零开头,则sample_function将使用sampletable0649940,而innerfunction会尝试访问sampletable649940因为转换中丢失了前导零。

您的错误消息虽然有七位数字,但可能是另一个问题。

为什么不使用临时表并使用固定名称?临时表仅在一个会话中可见,并且不会发生任何名称冲突。这就是临时表的用途。