我需要创建一个存储过程,它可以接受模式名和表名作为参数,并对同一个表进行更新。

CREATE OR REPLACE FUNCTION garscratch.update_table(schema_name text, table_name text ) RETURNS void as $$
DECLARE
 table TEXT;
BEGIN
execute 'update '||schema||'.'||table_name|| 'set id = substring(id from 1 for 2) where name = "test"';
END;
$$ LANGUAGE plpgsql;

当我执行上述程序时:
select update_table(my,my_table);

我知道错误:
列“我的”不存在。
它不将“my”作为模式名。

最佳答案

你需要在tablenameset之间留出一个空间。
您需要在值'test'周围加上引号。
或者如果它应该是一个列名,那么根本不需要引号。
您需要清理标识符以避免SQL注入。
改用(完全重写):

CREATE OR REPLACE FUNCTION garscratch.update_table(_tbl regclass)
  RETURNS void AS
$func$
BEGIN
EXECUTE 'UPDATE ' || _tbl || $$ SET id = left(id, 2) WHERE name = 'test'$$;
END
$func$ LANGUAGE plpgsql;

呼叫:
SELECT garscratch.update_table('myschema.my_table');

详细说明:
Table name as a PostgreSQL function parameter

关于postgresql - 从存储过程更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22990377/

10-16 11:53