1

今日は、ループ内で挿入ステートメントを使用して、関数を定義しました。しかし、HAWQ はエラーを返しました。

ERROR:  could not serialize unrecognized node type: 43983632 (outfast.c:4742)
CONTEXT:  SQL statement "insert into t(id,value) values(1,0.1)"
PL/pgSQL function "test_function" line 6 at SQL statement

いくつかのテストを行ったところ、ループで「挿入ステートメント」を使用すると、間違いとして報告されることがわかりました。関連する「挿入ステートメント」を削除すると、正常に実行できます。

テストの例を次に示します。

 CREATE OR REPLACE FUNCTION test_function()
  RETURNS int AS
$BODY$
declare 
	number int;
begin		
	number := 1;
	while number <= 10 loop
		insert into t(id,value) values(1,0.1);
		number := number+1;
	end loop;
	return number;
end
$BODY$
  LANGUAGE plpgsql ;

次に、「select test_function();」を使用します 関数を呼び出すと、上記のエラーが返されます。

これは、plpgsql を使用したループで SQL ステートメントを使用できないということですか?

ありがとう。よろしくお願いします。

4

2 に答える 2

1

HAWQ でシングルトン ステートメントを避けたいと思うでしょうが、それがうまくいかないことに少し驚いています。代わりに、セット ベースの操作を使用することをお勧めします。

    CREATE TABLE t (id int, value numeric);

    CREATE OR REPLACE FUNCTION test_function() RETURNS int AS
    $BODY$
    declare 
            number int;
    begin       
            insert into t (id, value) select 1, 0.1 from generate_series(1, 10);
            return 10;
    end
    $BODY$
    LANGUAGE plpgsql;

このような単純な例では、代わりに plpgsql よりもオーバーヘッドが少ない sql 関数を使用できます。

    DROP FUNCTION test_function();

    CREATE OR REPLACE FUNCTION test_function() RETURNS void AS
    $BODY$
            insert into t (id, value) select 1, 0.1 from generate_series(1, 10);
    $BODY$
    LANGUAGE sql;

これらの関数はどちらも、10 個のステートメントを個別に実行するのではなく、1 つのステートメントですべての作業を行います。HAWQ で両方をテストしたところ、両方とも動作しました。

また、HAWQ を使用してループ内でシングルトン挿入ステートメントを実行する必要がある場合の回避策を次に示します。

    CREATE OR REPLACE FUNCTION test_function()
      RETURNS int AS
    $BODY$
    declare 
            number int;
            v_sql text;
    begin       
            number := 1;
            while number <= 10 loop
                    v_sql := 'insert into t(id,value) values(1,0.1)';
                    execute v_sql;
                    number := number+1;
            end loop;
            return number;
    end
    $BODY$
      LANGUAGE plpgsql ;
于 2016-01-14T15:36:26.737 に答える