Создать функцию с аргументом в качестве подвыбора - PullRequest
1 голос
/ 05 июля 2010

Я хотел бы создать функцию для выбора и изменения данных

CREATE OR REPLACE FUNCTION PublicatedTask( argument ) RETURNS SETOF task AS $$DECLARE
   f task%ROWTYPE;   
  BEGIN
    FOR f IN SELECT * FROM Task where layer IN $1 and publicationin<>0 ORDER BY id LOOP
      if (f.publicationIN = 1) then
    f.description='';
    end if;    
    RETURN NEXT f; 
    END LOOP;
    RETURN;
  END;
  $$
 LANGUAGE 'plpgsql';

, но я не знаю, какой тип аргумента?

Я хотел бы сделать SELECT * FROM PublicatedTask((1,2,3));

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 06 июля 2010

Или используйте VARIADIC:

CREATE OR REPLACE FUNCTION PublicatedTask( VARIADIC argument int[]) RETURNS SETOF task AS $$DECLARE
   f task%ROWTYPE;   
  BEGIN
    FOR f IN SELECT * FROM Task where layer = ANY($1) and publicationin<>0 ORDER BY id LOOP
      if (f.publicationIN = 1) then
    f.description='';
    end if;    
    RETURN NEXT f; 
    END LOOP;
    RETURN;
  END;
  $$
 LANGUAGE 'plpgsql';

И используйте его следующим образом:

SELECT * FROM PublicatedTask(1,2,3);

VARIADIC доступно с версии 8.4: http://www.postgresql.org/docs/8.4/interactive/xfunc-sql.html#XFUNC-SQL-VARIADIC-FUNCTIONS

0 голосов
/ 05 июля 2010

вы можете использовать массив целых чисел в качестве параметра:

CREATE OR REPLACE FUNCTION PublicatedTask( argument int[]) RETURNS SETOF task AS $$DECLARE
   f task%ROWTYPE;   
  BEGIN
    FOR f IN SELECT * FROM Task where layer = ANY($1) and publicationin<>0 ORDER BY id LOOP
      if (f.publicationIN = 1) then
    f.description='';
    end if;    
    RETURN NEXT f; 
    END LOOP;
    RETURN;
  END;
  $$
 LANGUAGE 'plpgsql';

Тогда вы могли бы назвать это так:

SELECT * FROM PublicatedTask('{1,2,3}');
...