我在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“不存在”。
我无法解决这个问题。
答案 0 :(得分:0)
我发现此代码存在问题,但它与您的确切错误消息不完全匹配:
您将var4
传递给innerfunction
bigint
。
如果var4
以0649940
之类的零开头,则sample_function
将使用sampletable0649940
,而innerfunction
会尝试访问sampletable649940
因为转换中丢失了前导零。
您的错误消息虽然有七位数字,但可能是另一个问题。
为什么不使用临时表并使用固定名称?临时表仅在一个会话中可见,并且不会发生任何名称冲突。这就是临时表的用途。