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 に答える