我数据库中的许多表共享一个共同的布局,特别是它们有一个serial
以关系名称命名的主键。从 Web 应用程序中更新这些表通常涉及以下形式的查询:
UPDATE table SET attribute = x WHERE table_id = y
这很常见,我有一个执行此任务的存储过程:
CREATE OR REPLACE FUNCTION setvalue(
relname text,
row_id integer,
colname text,
newvalue text)
RETURNS void AS
$BODY$
BEGIN
EXECUTE format('UPDATE %I SET %I = $1 WHERE %I = $2', relname, colname, relname || '_id', colname) USING row_id;
END;
$BODY$
LANGUAGE plpgsql;
不幸的是,这不适用于非文本类型。例如,更新date
列给出ERROR: column ... is of type date but expression is of type text
. 假设文本是预期类型的有效文字表示,是否有安全的方法让 DBMS 找出正确的类型并做正确的事情?
到目前为止,我自己的解决方案是将字符串文字粘贴到查询中:
要不就
例如,这适用于适当格式化的日期类型 (
'1990-05-04'
)。可能这牺牲了能够重用查询计划的能力。