我想在psql中创建一个函数,以使用csv表中的新值更新my_table
。这是我的代码:
CREATE OR REPLACE FUNCTION update_my_table(file_path text, new_value text)
RETURNS void
LANGUAGE plpgsql
AS $func$
DECLARE sql text;
BEGIN
EXECUTE format($$ALTER TABLE my_table ALTER COLUMN some_column SET DEFAULT '%s';$$, new_value);
SELECT format($$\copy my_table(%s) FROM '%s' delimiter E'|' csv header;$$
, string_agg(quote_ident(attname), ', '), file_path)
INTO sql
FROM pg_attribute
WHERE attrelid = 'my_table'::regclass
AND attname != 'some_column'
AND NOT attname LIKE '%.....%'
AND attnum > 0;
EXECUTE sql;
ALTER TABLE my_table ALTER COLUMN some_column DROP DEFAULT;
END;
$func$;
我面临的问题是,如果我在...SELECT format($$\copy my_table(%s)...
中使用'/ copy',则会在'\'附近收到语法错误。
但是,如果我不使用\copy
而是使用copy
,则file_path
会出现错误,表示该文件不存在。
有解决此问题的方法吗?看来我选择的任何选项都行不通。
我很确定我必须使用/copy
来打开文件,但是如何通过语法错误得到提示?