如何使用EXECUTE FORMAT ......在Postgres的函数中使用(How to us

2019-07-17 15:14发布

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;
ALTER FUNCTION dummytest_insert_trigger()
  OWNER TO postgres;

我试图使用插入到dummyTest插入值(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

我无法得到的错误。

Answer 1:

你的函数可以这个样子了在Postgres 9.0或更高版本:

CREATE OR REPLACE FUNCTION dummytest_insert_trigger()
  RETURNS trigger 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$  LANGUAGE plpgsql;

关于RETURN NULL

  • 要忽略造成的PostgreSQL BEFORE触发器?

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

  • 是PostgreSQL列名区分大小写?

使用小写字母来代替:

quote_ident('dummytest')

实在是在使用动态SQL没有点EXECUTE只要你有一个静态的表名。 但是,这可能只是简化的例子吗?



Answer 2:

您需要eplxicit转换为text

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


文章来源: How to use EXECUTE FORMAT … USING in postgres function