2017-03-01 3 views
0

私は動的関数を作成しました。動的にテーブル名の一部を取得します。関数が正常に作成されます。しかし、私はその機能を実行します。私はエラーが発生します。どうすればこの問題を解決できますか?私は、エラーコードがPostgresql関数の動的テーブルquote_identエラー

ERROR: function quote_ident(integer) does not exist LINE 2: FROM dwgcould.adpes_v1_' || quote_ident(pro_id) || '_line... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. QUERY: SELECT 'SELECT st_x(st_centroid(st_transform(geom,4326))) as lng_center ,st_y(st_centroid(st_transform(geom,4326))) as lat_center FROM dwgcould.adpes_v1_' || quote_ident(pro_id) || '_line limit 1' CONTEXT: PL/pgSQL function dwgcould.getlatlngcenter(integer) line 4 at EXECUTE statement ********** Error ********** ERROR: function quote_ident(integer) does not exist SQL state: 42883 Hint: No function matches the given name and argument types. You might need to add explicit type casts. Context: PL/pgSQL function dwgcould.getlatlngcenter(integer) line 4 at EXECUTE statement

また、私はテーブルが存在するかどうかを確認するにはどうすればよいです

select * from dwgcould.getlatlngcenter(2000653); 


CREATE OR REPLACE FUNCTION dwgcould.getlatlngcenter(IN pro_id integer, 
    OUT lat_center double precision, OUT lng_center double precision) 
AS $$ 

BEGIN 
     EXECUTE 'SELECT st_x(st_centroid(st_transform(geom,4326))) as lng_center ,st_y(st_centroid(st_transform(geom,4326))) as lat_center 
     FROM dwgcould.adpes_v1_' || quote_ident(pro_id) || '_line limit 1'; 
END; 
$$ LANGUAGE plpgsql; 
で関数を呼び出しますか?

+0

'場合(pg_tablesから選択数(1)ここで、テーブル名= 'TN')その後、<1 ...'それが働いている –

答えて

0

活用フォーマット、例えば:

CREATE OR REPLACE FUNCTION dwgcould.getlatlngcenter(IN pro_id integer, 
    OUT lat_center double precision, OUT lng_center double precision) 
AS $$ 

BEGIN 
    if (select count(1) from pg_tables where tablename = format('adpes_v1_%s_line',pro_id)) < 1 then 
    raise info '%','NO SUCH TABLE!'; 
    return; 
    end if; 
    EXECUTE format('SELECT * FROM dwgcould.adpes_v1_%s_line limit 1',pro_id) into lat_center,lng_center; 
    return; 
END; 
$$ LANGUAGE plpgsql; 

docs

+0

が、私は空の価値を得る。私はlat_centerとしてst_centroid(st_centroid(st_transform(geom、4326)))として直接SELECT st_x(st_centroid(st_transform(geom、4326)))を実行します。 \t \t FROM dwgcould.adpes_v1_2000653_line limit 1結果が出ます。 – Alexis

+0

'lat_center、lng_center;に'を追加して実行してください –

+0

ありがとうございます。 – Alexis