2016-12-23 6 views
1

Я бегу km_test.sql из BAT-файла (Windows 7):Как передать переменную в Funtion в PostgreSQL

call psql -h ... -U ... -d ... -f C:\svn\tre2\prog\km_test.sql -v nrl=%a% 

где% в% представляет собой целое число. Я работаю на PostgreSQL 9.5.

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); 

Вопрос: Как сделать таблицу р (org_tre2.km_punkter_des2016) быть входным параметром? Значение того, как включить имя_таблицы в вызов функции (с помощью select km_tull (: n,: p)) и обратиться к этой таблице в функции?

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

select km_test(:n,:'tab') 

До сих пор мне не удалось ссылаться на входную таблицу как t-переменную в операторе FROM. Возможно ли это? Или есть обходной путь?

+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'); 

Раствор быть с помощью EXECUTE, поставить все INSER INTO-код внутри «», объявить S в качестве переменной и использовать с вместо J в WHERE-статье.