我需要创建一个存储过程,它可以将模式名称和表名作为参数,并在同一个表上进行更新。
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”视为架构名称。
答案 0 :(得分:2)
tablename
和set
之间的空格。'test'
的sinlge引号
或者,如果它应该是列名,那么根本不需要引号。改为使用(完全重写):
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');
答案 1 :(得分:1)
在我看来,您可能会遇到table_name|| 'set id=
部分的问题 - 具体来说,我认为您应该在'
和set
之间添加空格。尝试打印您正在执行的内容,您可能会发现问题所在。
答案 2 :(得分:0)
执行程序如下:
select update_table('my','my_table');
同时更改行
execute 'update '||schema||'.'||table_name|| 'set id = substring(id from 1 for 2) where name = "test"';
到
execute 'update '||schema_name||'.'||table_name|| 'set id = substring(id from 1 for 2) where name = "test"';