Postgresql

在插入中呼叫帶有參數的函式

  • December 10, 2013

是否有可能在 SQL 中優雅地實現以下目標:

insert into my_table (the_geom) VALUES 
   geomfromwkb('\x010100000058b4b610a73a27408144b7147f194840',4326)),
   geomfromwkb('\x010100000058b4b610a73a27408144b7147f194840',4326)),
   .....

geomfromwkb這涉及使用兩個參數呼叫外部函式?

到目前為止,我有一個不優雅的解決方案。第一個解決方案是這種類型:

insert into mytable (the_geom) select 
   geomfromwkb('\x010100000058b4b610a73a27408144b7147f194840',4326)) union
   geomfromwkb('\x010100000058b4b610a73a27408144b7147f194840',4326)) union
   .....

第二個使用prepare語句:

PREPARE my_insert AS INSERT INTO geom_example (the_geom) 
   VALUES (geomfromwkb($1,4326));
EXECUTE my_insert ('\x010100000058b4b610a73a27408144b7147f194840');
EXECUTE my_insert ('\x010100000058b4b610a73a27408144b7147f194840');
statement: DEALLOCATE my_insert;

**問題一:**還有比這更優雅的嗎?

問題 2:當數據庫看到一堆聯合時,它會做什麼?

問題 3:prepare 真的比一個 fat insert 快嗎?

問題4:字節序列是幾何類型。是否可以跳過一致性檢查(以確保這確實是幾何字節序列)以加快插入速度?

您可以使用該子句建構一個“表”VALUES並在其之上建構函式呼叫:

INSERT INTO wgs84 (wkb_geometry, wkb_geography)
SELECT st_transform(st_setsrid(st_makepoint(col1, col2), col3), col4)
 FROM (
       VALUES (694274.6998, 5341745.2959, 25832, 4326),
              ( 69425.6998, 5341754.23,   25834, 4327)
      ) t (col1, col2, col3, col4);

這比重複的函式呼叫更容易閱讀、編寫和修改。您甚至可以對齊數據,這有時會使查找錯誤變得更容易。

一個版本可以將其VALUES放入 WITH 查詢中。在某些情況下,最好將COPY數據放入(最好使用命令)臨時表並在INSERT語句中從中進行選擇 - 當輸入大小變大時,這會很方便。

引用自:https://dba.stackexchange.com/questions/54721