Вы получили первую ошибку:
ERROR: column "Java,CPP" does not exist
... за пропущенные одинарные кавычки вокруг строкового литерала в функции звоните .Как и
SELECT testing("Java,CPP"); -- missing ''!
Вы, вероятно, хотите обрезать эти двойные кавычки из входных данных, поэтому вызов должен быть действительно:
SELECT testing('Java,CPP');
Связанный:
При фиксированном вызове ошибка скрывается из-за несоответствия типов данных в функциитело наносит удар.Вы пытаетесь назначить unique_code text
на foo text[]
:
ERROR: malformed array literal: "Java"
Например, это будет работать:
CREATE OR REPLACE FUNCTION testing(_ll text[]) -- taking array of text
RETURNS text[] AS
$func$
DECLARE
foo text[];
BEGIN
foo := ARRAY( -- array constructor
SELECT unique_code
FROM codings
WHERE unique_code = ANY(_ll)
);
RETURN foo;
END
$func$ LANGUAGE plpgsql;
Вызов:
SELECT testing('{Java,CPP}'); -- note syntax of array literal
См .:
Передача действительного литерала массива также позволяет избежатьдорогой и ненужный regexp_split_to_array()
звонок.(Функции регулярного выражения являются мощными, но сравнительно дорогими.)
или аналогично VARIADIC
функция:
CREATE OR REPLACE FUNCTION testing(VARIADIC _ll text[])
... -- rest as above
Вы все еще можете пройтилитералы массива (или истинные значения массива) с ключевым словом VARIADIC
в вызове:
SELECT testing(VARIADIC '{Java,CPP}'); -- with array
Или вы можете передать список значений элемента (до 100):
SELECT testing('Java','CPP'); -- with list of values
Похожие:
Если , вы обязательно должны передать свою строку в исходной форме ,trim()
двойные кавычки и используйте намного дешевле string_to_array()
вместо regexp_split_to_array()
:
CREATE OR REPLACE FUNCTION testing(_ll text)
RETURNS text[] AS
$func$
DECLARE
foo text[];
BEGIN
foo := ARRAY(
SELECT unique_code
FROM codings
WHERE unique_code = ANY(string_to_array(trim(_ll, '"'), ','))
);
RETURN foo;
END
$func$ LANGUAGE plpgsql;
Позвоните:
SELECT testing('"Java,CPP"'); -- even with enclosing double quotes
В сторону: скорее не используйте загадку ll
в качестве имени параметра.Легко неправильно истолковывается как 11
...