我需要创建一个存储过程,它可以将架构名称和表名称作为参数并在同一个表上进行更新。
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);
我得到错误:
Column "my" does not exist.
它不会将“my”视为架构名称。
最佳答案
tablename
和set
之间需要一个空格。- 您需要在值
'test'
周围加上单引号。
或者,如果它应该是列名,则根本不需要引号。 - 您需要清理标识符以避免 SQL 注入(inject)。
改用(完全重写):
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');
关于postgresql - 从存储过程更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22990377/