Запутанная ошибка PL / PgSQL

#postgresql #plpgsql

#postgresql #plpgsql

Вопрос:

Я написал следующую функцию для Postgres, и она отлично работает на моем локальном компьютере с Windows при установке через pgAdmin. Когда я пытаюсь добавить ее в свою серверную установку на базе Linux, она выдает ошибку компиляции:

ЗАПРОС: ВЫБЕРИТЕ $ 1 (split_part( $2,’ ‘, $3 )) КОНТЕКСТ: оператор SQL в функции PL / PgSQL «splitwords» возле строки 34

 CREATE OR REPLACE FUNCTION splitwords(text, int)
  RETURNS text AS
$BODY$
DECLARE
inwords ALIAS FOR $1;
posn INTEGER;
existcount INTEGER;
incurrdataid ALIAS FOR $2;
currdataid INTEGER;
currwordid INTEGER;
length INTEGER;
wordpos INTEGER;
newword TEXT;
BEGIN
currdataid:=incurrdataid;
currdataid:=currdataid-1; --corrects for auto-increment error
posn:=1;
WHILE posn<11 LOOP
IF split_part(inwords,' ',posn)='' THEN
-- If no more words are available
    EXIT;
ELSE
--If not at the end of the words
    IF (SELECT wordID FROM words WHERE word=split_part(inwords,' ',posn))>0 THEN
    --If word is already in lexicon
        currwordid:=(SELECT wordID FROM words WHERE word=split_part(inwords,' ',posn))::INTEGER;
        existcount:= (SELECT count FROM words WHERE word=split_part(inwords,' ',posn))::INTEGER;
        UPDATE words SET count=existcount 1 WHERE word=split_part(inwords,' ',posn);
        INSERT INTO wordsdata(wordid,dataid) VALUES (currwordid,currdataid);
        posn:=posn 1;
    ELSE
    --If word is new
        newword=split_part(inwords,' ',posn);
        INSERT INTO words(word,count) VALUES (newword,1);
        currwordid:=(SELECT wordID FROM words WHERE word=split_part(inwords,' ',posn))::INTEGER;
        INSERT INTO wordsdata(wordid,dataid) VALUES (currwordid,currdataid);
        length:=length(split_part(inwords,' ',posn));
        wordpos:=1;
        WHILE wordpos<(length 1) LOOP
            INSERT INTO searchchar(searchstr,wordid) VALUES (substring(split_part(inwords,' ',posn),1,wordpos),currwordid);
            wordpos=wordpos 1;
        END LOOP;
        posn:=posn 1;
    END IF;
END IF;
END LOOP;

RETURN 'rows added';
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
  

Прошелся по Google и документации, но не могу найти ничего подходящего. Я очень смущен! Любая помощь, которую вы можете предложить, очень ценится!

Ответ №1:

Не читал вашу функцию, но сообщение об ошибке обычно означает, что переменная имеет то же имя, что и столбец. Префикс имен переменных с _ обычно является хорошим средством избежать сообщения, и это делает функции plpgsql немного более удобочитаемыми.

Кроме того, в вашем коде есть по крайней мере одно вхождение = , которое выглядит так, как будто это должно быть := . plpgsql прощает подобные вещи, но вы не должны на это рассчитывать.

Комментарии:

1. В строке 34 есть зарезервированное слово count . Это было бы моим первым предположением.