2016-03-14 1 views
1

Я переношу код с Oracle на PosgreSQL (классический, Carl). я обнаружил, что моя функция называется 3 раза, я делаю этот простой пример: Посмотрите, пожалуйста, на моем примере:Как устранить множественный вызов функции с несколькими параметрами INOUT в PostgreSQL

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 раза и как избежать этого случая? Спасибо.

ответ

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; 
Смежные вопросы