postgresql 如何使用EXECUTE FORMAT ...在Postgres函数中使用

khbbv19g  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(197)
CREATE OR REPLACE FUNCTION dummytest_insert_trigger()
   RETURNS trigger AS
$BODY$
DECLARE
   v_partition_name    VARCHAR(32);
BEGIN
   IF NEW.datetime IS NOT NULL THEN
      v_partition_name := 'dummyTest';            
      EXECUTE format('INSERT INTO %I VALUES ($1,$2)',v_partition_name)using NEW.id,NEW.datetime;            
   END IF;                  
   RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE COST 100;

我正在尝试插入使用:

INSERT INTO dummytest VALUES(1,'2013-01-01 00:00:00+05:30');

但它显示错误为:

ERROR: function format(unknown) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Context: PL/pgSQL function "dummytest_insert_trigger" line 8 at EXECUTE statement

我无法得到错误。

i7uaboj4

i7uaboj41#

在Postgres 9.0或更高版本中,您的函数可能看起来像这样:

CREATE OR REPLACE FUNCTION dummytest_insert_trigger()
  RETURNS trigger
  LANGUAGE plpgsql AS
$func$
DECLARE
   v_partition_name text := quote_ident('dummyTest');  -- assign at declaration
BEGIN
   IF NEW.datetime IS NOT NULL THEN
      EXECUTE 'INSERT INTO ' || v_partition_name || ' VALUES ($1,$2)'
      USING NEW.id, NEW.datetime;              
   END IF;                    

   RETURN NULL;  -- you sure about this?
END
$func$;

关于RETURN NULL

  • 在PostgreSQL的BEFORE TRIGGER中忽略结果?

我建议不要混合大小写标识符。使用format(... %I ...)quote_ident(),您将得到一个名为"dummyTest"的表,您将不得不在其存在的其余部分使用双引号。相关内容:

  • PostgreSQL列名区分大小写吗?

请改用小写:

quote_ident('dummytest')

只要有一个静态表名,就没有必要在EXECUTE中使用动态SQL。但这可能只是一个简单的例子?
旁白:这种触发器在Postgres 10或更高版本的声明式分区中已经过时了。

wqsoz72f

wqsoz72f2#

您需要显式强制转换为text

EXECUTE format('INSERT INTO %I VALUES ($1,$2)'::text ,v_partition_name) using NEW.id,NEW.datetime;

相关问题