1

Oracle から PosgreSQL (クラシック、カール) にコードを移植します。関数が 3 回呼び出されていることがわかりました。この簡単な例を作成します。私の例を見てください。

create function trak_test001(inout int,inout int, inout int)
AS
$BODY$
<<trak_test001>>
DECLARE
  x ALIAS FOR $1;
  y ALIAS FOR $2;
  z ALIAS FOR $3;

BEGIN
  Raise DEBUG  'trak_test001 FOR x=% y=% z=% ',x,y,z;
  x:=x+1;
  y:=y+1;
  z:=z+1;
END trak_test001;
$BODY$
LANGUAGE plpgsql VOLATILE 
COST 1000;

create function trak_test002()
RETURNS void
AS
$BODY$
<<trak_test002>>
DECLARE
  x int default 0;
  y int default 0;
  z int default 0;

BEGIN
  Raise DEBUG  'trak_test002 FOR x=% y=% z=% ',x,y,z;
 SELECT (trak_test001(x,y,z)).* INTO x,y,z;
    Raise DEBUG  'trak_test002 FOR x=% y=% z=% ',x,y,z;
END trak_test002;
$BODY$
LANGUAGE plpgsql VOLATILE 
COST 1000;

SELECT trak_test002();

そして、次のデバッグ出力を得ました:

DEBUG:  trak_test002 FOR x=0 y=0 z=0
DEBUG:  trak_test001 FOR x=0 y=0 z=0 
CONTEXT:  SQL statement "SELECT (trak_test001(x,y,z)).*"
PL/pgSQL function trak_test002() line 10 at SQL statement
DEBUG:  trak_test001 FOR x=0 y=0 z=0 
CONTEXT:  SQL statement "SELECT (trak_test001(x,y,z)).*"
PL/pgSQL function trak_test002() line 10 at SQL statement
DEBUG:  trak_test001 FOR x=0 y=0 z=0 
CONTEXT:  SQL statement "SELECT (trak_test001(x,y,z)).*"
PL/pgSQL function trak_test002() line 10 at SQL statement
DEBUG:  trak_test002 FOR x=1 y=1 z=1
Total query runtime: 56 msec

これは質問です: なぜ私の関数は 3 回呼び出され、このケースを回避するには? ありがとうございました。

4

1 に答える 1

0

私はばかです。複数の INOUT パラメータを使用して関数を呼び出す正しい方法は次のとおりです。

create function trak_test002()
RETURNS void
AS
$BODY$
<<trak_test002>>
DECLARE
  x int default 0;
  y int default 0;
  z int default 0;

BEGIN
  Raise DEBUG  'trak_test002 FOR x=% y=% z=% ',x,y,z;
 SELECT * INTO x,y,z FROM trak_test001(x,y,z);
    Raise DEBUG  'trak_test002 FOR x=% y=% z=% ',x,y,z;
END trak_test002;
$BODY$
LANGUAGE plpgsql VOLATILE 
COST 1000;
于 2016-03-14T18:52:31.447 に答える