0

您好,我只是在学习 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 更容易理解。

任何帮助将不胜感激!

4

1 回答 1

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任何带有动态标识符的查询
  • 使用quote_ident来防范 SQLi
  • 使用 USING 子句传递以避免强制转换和引用。
于 2011-11-07T23:14:35.740 回答