你好我刚学习postGIS,因此postgresql(9.1)并试图通过创建一个sql函数重新投影一些空间数据来节省一些时间来反复复制相同的代码。
Create Function reproject_shapefile(text,text,numeric) returns void as $$
-- Reprojects shapefiles given that they follow the pattern "gid * the_geom"
CREATE TABLE $2 AS
SELECT *, ST_Transform(the_geom,$3) AS the_geom2
FROM $1;
Alter table $2 add Primary Key (gid);
Alter table $2 drop column the_geom;
Alter table $2 rename column the_geom2 to the_geom;
$$ Language SQL;
我阅读了指定如何执行此操作的文档,但每次尝试从pgAdmin中的sql编辑器创建函数时,都会收到以下错误:
ERROR: syntax error at or near "$2"
LINE 5: CREATE TABLE $2 AS
^
********** Error **********
ERROR: syntax error at or near "$2"
SQL state: 42601
Character: 175
与python中的错误消息不同,这告诉我绝对没有使用,所以我希望有人可以指出我正确的方向来解决这个错误。
如果有一些方法可以使用python执行相同的功能,请随意将其作为解决方案发布,因为python语法比古代SQL更容易理解。
非常感谢任何帮助!
答案 0 :(得分:4)
您无法以此形式编写动态SQL。参数只能传递值,而不能传递标识符。在SQL函数中,这样的事情是不可能的:
CREATE TABLE $2 AS
您需要为此编写plpgsql函数并使用EXECUTE
。可能看起来像这样:
CREATE OR REPLACE FUNCTION reproject_shapefile(text, text, numeric)
RETURNS void as $$
BEGIN
EXECUTE '
CREATE TABLE ' || quote_ident($2) || ' AS
SELECT *, ST_Transform(the_geom,$1) AS the_geom2
FROM ' || quote_ident($1)
USING $3;
EXECUTE 'ALTER TABLE ' || quote_ident($2) || ' ADD PRIMARY KEY (gid)';
EXECUTE 'ALTER TABLE ' || quote_ident($2) || ' DROP COLUMN the_geom';
EXECUTE 'ALTER TABLE ' || quote_ident($2) || ' RENAME column the_geom2 TO the_geom';
END;
$$ Language plpgsql;
plpgsql
功能,而不是sql
EXECUTE
任何带有动态识别码的查询