Не могу понять, почему я получил эту ошибку "неверно сформированный массив" - PullRequest
0 голосов
/ 18 октября 2018

Кто-нибудь может мне объяснить, что я делаю не так?

CREATE OR REPLACE FUNCTION validation(
   string_to_match varchar[],
   pattern varchar,
   validation_type varchar
) RETURNS boolean AS $$  
DECLARE a_length ALIAS FOR $1;
DECLARE result_validation ALIAS FOR $2;
BEGIN
    IF validation_type =  'login' THEN
        $1 := array_length(string_to_match,1); 
        RAISE NOTICE 'Login if , Array length is %', $1; 
    ELSIF validation_type = 'register' THEN 
        $1 := array_length(string_to_match,1); 
        RAISE NOTICE 'Array length is %', $1; 
    ELSIF validation_type =  'contact' THEN 
        $1 := array_length(string_to_match,1); 
        RAISE NOTICE 'Array length is %', $1; 
    END IF; 

    RETURN $1;
END;    
$$ lANGUAGE plpgsql;

Вызов:

SELECT validation (
   '{1,2,3,4,5}',
    '([a-zA-Z]{2,20}[\.\-\_])([a-zA-Z]{2,20}[0-9]{2,20})@([a-z]{2,6})\.([a-z]{2,3})',
    'login');

Ошибка:

ERROR:  malformed array literal: "5"
DETAIL:  Array value must start with "{" or dimension information.
CONTEXT:  PL/pgSQL function validation(character varying[],character varying,character varying) line 7 at assignment
SQL state: 22P02

1 Ответ

0 голосов
/ 18 октября 2018

$1 является первым параметром функции, поэтому $1, string_to_match и a_length указывают на один и тот же объект типа character varying[].

Итак, присвоение

$1 := array_length(string_to_match,1);

пытается присвоить 5 переменной массива, что вызывает наблюдаемую ошибку.

Похоже, вы не понимаете роль $1.Пропустите часть ALIAS FOR $1 и используйте a_length вместо $1.

...