我需要创建一个存储过程,它可以接受模式名和表名作为参数,并对同一个表进行更新。
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”作为模式名。
最佳答案
你需要在tablename
和set
之间留出一个空间。
您需要在值'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/