#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
. Это было бы моим первым предположением.