2011-05-12 8 views
0

私はPostgres用の以下の関数を書いており、pgAdmin経由でインストールするとローカルのWindowsマシンで正常に動作します。私はLinuxベースのサーバにそれを追加しようとすると、それはコンパイルエラースローインストール:PL/PgSQLの混乱しているエラー

QUERYの:$ 1(split_part($ 2、」」、$ 3))SELECT CONTEXT:PL/pgSQL関数内のSQL文は "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のトロールやドキュメントを持っていたが、私は、関連する何かを見つけることができません。私は非常に混乱しています!何か助けて頂ければ幸いです。

答えて

2

関数を読み込んだことはありませんが、エラーメッセージは通常、変数が列と同じ名前を持つことを意味します。変数名に_を接頭辞として付けるのは、通常、メッセージを避けるための良い手段であり、plpgsql関数を少し読みやすくします。

また、のように見えるコードに少なくとも=というオカレンスが1つあります。 plpgsqlはこのようなことを許していますが、それを信じるべきではありません。

+3

行34には予約語 'count'があります。それは私の最初の推測だろう。 – Mel