我尝试根据某些条件更新表,但遗憾的是表名可以更改,因此我创建了一个函数,该函数通过2个数组并根据数组和其他表值更新表。
基本上我不想修改没有ISO标准短名称的小国家的国家代码。
我的问题是我的查询中有一些语法问题,没有别的。这是实现该查询的正确方法吗?
你的帮助是合适的。谢谢。 编辑: 该功能的最终工作版本:(请不要犹豫,建议一些改进)
CREATE OR REPLACE FUNCTION fixCountryCodes(destinationTable text, sourceTable text)
RETURNS void
AS $$
DECLARE
countryNames varchar[] := ARRAY['ALD', 'BJN', 'CNM', 'CYN', 'ESB', 'IOA', 'ISR', 'KAB', 'KAS', 'NOR', 'PSX', 'SCR', 'SDS', 'SER', 'SOL', 'UMI', 'USG', 'WSB'];
rightCountryCodes varchar[] := array['FI', 'CO', 'CY', 'TU', 'UK', 'AU', 'IS', 'KZ', 'KZ', 'NO', 'WE', 'CH', 'OD', 'CO', 'SO', 'US', 'US', 'UK'];
BEGIN
FOR I IN 1..array_upper(countryNames, 1) LOOP
EXECUTE 'UPDATE ' || destinationTable || ' s ' || 'SET name = '''|| rightCountryCodes[i] || ''' FROM ' || sourceTable || ' n WHERE n.adm0_a3 LIKE ''' || countryNames[i] || ''' AND n.gid = s.id';
END LOOP;
END
$$ LANGUAGE plpgsql;
答案 0 :(得分:1)
CREATE OR REPLACE FUNCTION
的语法错误。您必须使用语法:
CREATE FUNCTION name(params)
RETURNS void -- in your case
AS $$
DECLARE ...
BEGIN
END;
$$ LANGUAGE plpgsql;