2016-12-23 10 views
1

に目的球内の変数を転送します。私はPostgreSQL 9.5で動作しています。はどのようにバットファイル(Windows 7)から<strong>km_test.sql</strong>を実行しているPostgreSQLの

km_test.sqlこの

\set n :nrl 

DROP FUNCTION km_test(integer); 
CREATE FUNCTION km_test(n integer) 
    RETURNS void AS 
$BODY$ 
DECLARE 
    j smallint; 

BEGIN 
    DROP TABLE IF EXISTS km_test CASCADE; 
    CREATE UNLOGGED TABLE km_test (
    lnr smallint, 
    km_id character varying(16), 
    flatenr smallint, 
    geo geometry(Linestring,25833) 
    ); 
    j = 1; 
    WHILE j < n+1 LOOP 
    RAISE NOTICE 'Verdi j er : %', j; 
    INSERT INTO km_test (lnr, km_id, flatenr, geo) 
     SELECT d.i, 
      p.km_id, 
      CAST(substring(p.flatenr from 5 for 4) AS smallint), 
      ST_MakeLine(p.geo,(ST_Translate(p.geo, d.dx, d.dy))) 
     FROM org_tre2.km_punkter_des2016 AS p, org_tre2.km_dxdy1 AS d 
     WHERE j = d.i; 
    j = j + 1; 
    END LOOP; 
    COMMENT ON TABLE org_tre2.km_test IS 'KM innsyn: n innsynslinjer for kulturminnepunkt utenfor IK i tre2-flater'; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

\set tab 'org_tre2.km_punkter_des2016' 
select km_test(:n); 

質問のようになります。はどのように私はテーブルP(org_tre2.km_punkter_des2016)は入力パラメータであることを作るのですか?意味は、tablenameを関数呼び出し(select km_tull(:n、:p))に含める方法を意味し、関数内でこのテーブルを参照していますか?

CREATE FUNCTION km_test(n integer, t text) 
... 

select km_test(:n,:'tab') 

これまでのところ、入力テーブルをFROMステートメントのt変数として参照することはできませんでした。 可能ですか?または回避策がありますか?

+0

ダイナミックコマンドを見てください。 https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN – McNets

+0

リンク@mcNetsをありがとう。私はそれを理解したと思う。 – 9ls1

+0

あなたは大歓迎です。 – McNets

答えて

1

ヒント/リンク@McNetsをありがとう。私はそれを理解したと思う。 km_test.sqlで正しいコード:

\set n :nrl 

DROP FUNCTION km_test(integer, text); 
CREATE FUNCTION km_test(n integer, t text) 
    RETURNS void AS 
$BODY$ 
DECLARE 
    j smallint; 
    s integer; 

BEGIN 
    DROP TABLE IF EXISTS km_test CASCADE; 
    CREATE UNLOGGED TABLE km_test (
    lnr smallint, 
    km_id character varying(16), 
    flatenr smallint, 
    geo geometry(Linestring,25833) 
    ); 
    j = 1; 
    WHILE j < n+1 LOOP 
    s:=j; 
    RAISE NOTICE 'Verdi j er : %', j; 
    RAISE NOTICE 'Tabell t er : %', t; 
    EXECUTE 'INSERT INTO km_test (lnr, km_id, flatenr, geo) 
     SELECT d.i, 
      p.km_id, 
      CAST(substring(p.flatenr from 5 for 4) AS smallint), 
      ST_MakeLine(p.geo,(ST_Translate(p.geo, d.dx, d.dy))) 
     FROM '||t||' as p, org_tre2.km_dxdy1 AS d 
     WHERE '||s||' = d.i'; 
    j = j + 1; 
    END LOOP; 
    COMMENT ON TABLE org_tre2.km_test IS 'KM innsyn: n innsynslinjer for kulturminnepunkt utenfor IK i tre2-flater'; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

\set ptab 'org_tre2.km_punkter_des2016' 
select km_test(:n,:'ptab'); 

され、「」内のすべてのINSER INTOコードを入れて、EXECUTE変数としてSを宣言し使用して、使用するソリューションではなく、WHERE句で、jのです。

関連する問題