2015-04-27 3 views
1

Я использую Postgres 8.4 и я попытался запустить create function ... скрипт из командной строки с помощьюНевозможно создать plpgsql функцию с помощью Psql -f имя_файла вариант

psql dbname -U username -f filename 

или

psql -f filename -d dbname -U username 

и это всегда приводит к следующей погрешности:

psql:mergenodedata.sql:40: ERROR: syntax error at or near "create" LINE 1: create or replace FUNCTION updNode (oldnodename varchar, ne...

где строка 40 является концом файла

$$ LANGUAGE plpgsql; 

Если я вырезал содержимое файла и-вставки файла в pgadmin или открытой сессии Psql, то create function будет отлично.

Код

create or replace FUNCTION updNode (oldnodename varchar, newnodename varchar, scnname varchar, cid integer) returns void AS $$ 
declare 
     oldnodeid integer; 
     newnodeid integer; 
     scnid integer; 
     newcount integer; 
     oldcount integer; 

BEGIN 

raise notice 'doing %', oldnodename; 

select id from nodes where nodename = oldnodename and cityid = cid into oldnodeid; 
select id from nodes where nodename = newnodename and cityid = cid into newnodeid; 
select id from scenario where name = scnname and cityid = cid into scnid; 

raise notice 'oldnodeid is %', oldnodeid; 
raise notice 'newnodeid is %', newnodeid; 
raise notice 'scnid is %', scnid; 

select count(*) from collection_node_result where node1id = newnodeid and scenario_collection_id in (
     select id from scenario_collection where scenarioid = scnid into newcount 
); 

raise notice 'newcount is %', newcount; 

select count(*) from collection_node_result where node1id = oldnodeid and scenario_collection_id in (
     select id from scenario_collection where scenarioid = scnid into oldcount 
); 

raise notice 'oldcount is %', oldcount; 


update collection_node_result set node1id = newnodeid where node1id = oldnodeid and scenario_collection_id in (
     select id from scenario_collection where scenarioid = scnid 
); 


END; 
$$ LANGUAGE plpgsql; 

Другие страницы я refernced являются

Run plpgsql program to update the data in table

http://www.postgresql.org/docs/8.4/static/plpgsql-development-tips.html

+0

Несвязанный интересный факт: как, честно говоря, мое единственное желание прямо сейчас - сделать этот счетчик дней «легендарного значка» ... Я забыл: этот счетчик переключается, как только у вас есть +200 из * ничего * на заданный день. И этот один вопрос, который был удален ... все еще появляется с +40 ... -40. Таким образом, эти 4 upvotes все еще способствовали 1490 году. – GhostCat

ответ

2

Похоже разбитого файла - некоторые проблемы могут быть осуществлены с помощью BOM http://en.wikipedia.org/wiki/Byte_order_mark или окончание символ "^ z". Посмотрите на файл в каком-то шестнадцатеричном коде и проверьте запуск и проверьте конец файла. У меня были подобные проблемы, когда я использовал файлы, созданные на другой операционной системе.

+0

Спасибо 'vi myfile.sql', а затем': set fileencoding = ascii' –

Смежные вопросы