Postgresql

將字元串作為表名和列名的函式

  • October 20, 2017

我正在嘗試編寫一個函式,該函式將participation根據表中存在的 id 在survey_name表中創建一個新列:

CREATE OR REPLACE FUNCTION survey_participated(_sn text)
 returns void AS
$func$
BEGIN
 EXECUTE format($$ALTER TABLE participation ADD COLUMN %I integer DEFAULT 0$$,_sn);
 EXECUTE format($$UPDATE TABLE participation SET %I = 1 WHERE participation.participant_id = %I.participant_id$$,_sn,_sn);
END
$func$ LANGUAGE plpgsql;

我不斷收到錯誤:

[2017-10-19 12:38:09] [42601] ERROR: syntax error at or near "TABLE"
[2017-10-19 12:38:09] Where: PL/pgSQL function survey_participated(text) line 4 at EXECUTE

有人可以指出我的錯誤嗎?

第一個問題是 for 的語法UPDATE不允許使用可選的TABLEafter。只是不需要。UPDATE只在桌子上操作;ALTER適用於許多目標。第二個問題是應該是%s(文字/字元串)而不是%I(標識符)。

EXECUTE format(
 $$ALTER TABLE participation ADD COLUMN %I integer DEFAULT 0;$$,
 _sn
);
EXECUTE format(
 $$
   UPDATE participation
   SET %I = 1
   WHERE participation.participant_id = quote_literal(%s||participant_id);
 $$,
 _sn,
 _sn
);

話雖如此,這似乎是一個可怕的想法。您正在向表中添加一列,並將該列的值設置為“colname+id”?這有什麼用?

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