Postgresql 如何使用执行格式。。。在postgres函数中使用

Postgresql 如何使用执行格式。。。在postgres函数中使用,postgresql,format,execute,using,Postgresql,Format,Execute,Using,我正在尝试使用 插入Dummy测试值(1,'2013-01-01 00:00:00+05:30') 但它显示错误为 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

我正在尝试使用 插入Dummy测试值(1,'2013-01-01 00:00:00+05:30')

但它显示错误为

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;

我无法获取错误。

您需要显式转换到
文本:

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

在Postgres 9.0或更高版本中,您的函数可能如下所示:

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

我建议不要使用混合案例标识符。使用
格式(..%I..)
quote_ident()
,您将得到一个名为
“dummyTest”
的表,在其剩余存在期间,您必须对其进行双引号引用。相关的:

请使用小写:

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;

只要您有一个静态表名,就没有必要将动态SQL与
EXECUTE
一起使用。但这可能只是一个简化的示例?

您使用的是哪个版本的PostgreSQL?好的,9.1中增加了
format
函数。是的。我遇到了问题。这是由于版本原因造成的。我使用的是版本9.0。Thanks@mona:升级后:不需要强制转换为
文本
text
是引用文本的默认类型。::是的。这是一个简化的eample。实际上,我正在使用数据库分区,因为表名是动态生成的,但对于更简单的部分,它仍然不起作用。在postgres 9.1上,我将上述所有内容用小写形式与dummytest一起使用,并得到以下错误:堆栈深度限制超出提示:在确保平台的堆栈深度限制足够后,增加配置参数“max_stack_depth”(当前为2048kB)。上下文:SQL语句“插入dummytest值($1,$2)”PL/pgSQL函数“dummytest_插入_触发器”执行时的第7行statement@mona:听起来您可能正在使用触发器创建一个无限循环。避免这种情况是你的责任。@Erwin Brandstetter:是的,这是我的错误。谢谢你的解决方案奏效了。:)这很完美,“只要您有一个静态表名,就没有必要将动态SQL与EXECUTE一起使用。”。
quote_ident('dummytest')