8
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

エラーが発生しません。

4

2 に答える 2

18

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

大文字と小文字が混在する識別子は使用しないことをお勧めします。format( .. %I ..)またはを使用quote_ident()すると、という名前のテーブルが得られ"dummyTest"ます。このテーブルは、残りの部分を二重引用符で囲む必要があります。関連している:

代わりに小文字を使用してください:

quote_ident('dummytest')

EXECUTE静的テーブル名がある限り、動的SQLを使用しても意味がありません。しかし、それはおそらく単純化された例にすぎませんか?

于 2012-12-28T08:27:33.980 に答える
3

への明示的なキャストが必要ですtext:

EXECUTE format('INSERT INTO %I VALUES ($1,$2)'::text ,v_partition_name) using NEW.id,NEW.datetime;
于 2012-12-28T07:01:16.707 に答える