2015-01-23 2 views
1

Допустим, у меня есть эта функция:Передача нескольких значений в одном параметре

CREATE OR REPLACE FUNCTION test_function(character varaying) 
    RETURNS integer AS 
$BODY$ 
DECLARE 
some_integer integer; 
begin 
    Select column2 from test_table where column1 in ($1) into some_integer; 
end; 
Return some_integer; 
$BODY$ 
LANGUAGE plpgsql VOLATILE COST 100; 

И я хочу, чтобы назвать это так:

Select * from test_function ('data1', 'data2','data3'); 

Конечно, это не может быть сделано таким образом, потому что Postgres пытается найти функцию с этим именем и тремя параметрами, которые не существуют.

Я попытался поместить кавычки в запятую, но в этом случае параметр интерпретируется неправильно: data1 ',' data2 ',' data3, как одна строка.

Есть ли способ поместить несколько значений в параметр, так что пункт IN может распознать его?

+1

Я думаю, вы можете передать параметр массива. Посмотрите на это: http://stackoverflow.com/questions/570393/postgres-integer-arrays-as-parameters – mlinth

ответ

0

Ваша функция не будет создана. RETURN после end - синтаксическая бессмыслица.

В любом случае, функция с параметром VARIADIC делает точно что вы просите:

CREATE OR REPLACE FUNCTION test_function(VARIADIC varchar[]) 
RETURNS SETOF integer AS 
$func$ 
SELECT column2 
FROM test_table 
WHERE column1 = ANY($1); 
$func$ LANGUAGE sql; 

вызова (по желанию):

SELECT * FROM test_function('data1', 'data2', 'data3'); 

Используя простую функцию SQL, plpgsql является не требуется для простого примера. Но VARIADIC работает и для функций plpgsql.

Использование RETURNS SETOF integer, так как это, очевидно, может возвращать несколько строк.

Детали:

SQL Fiddle демо с дополнительными параметрами.

+0

, но что, если у меня есть больше параметров? предположим (дата, дата, VARIADIC varchar []) ... как я могу назвать эту функцию? –

+0

, когда я называю это следующим образом: SELECT * FROM test_function ('2015-01-01', '2015-01-20', 'data1', 'data2', 'data3'); Я получаю ошибку - функция test_function (дата, дата, неизвестно, неизвестно, неизвестно) не существует –

+0

@AcoVujic: У вас может быть только один параметр * VARIADIC', и он должен быть последним. Пожалуйста, прочтите руководство, я добавил ссылку. Ваш звонок будет работать. Я добавил скрипку. –

Смежные вопросы