在PostgreSQL 9.1中,PL / pgSQL给出了一个查询:
select fk_list.relname from ...
其中relname的类型name(例如“ table_name”)。
relname
name
如何获得“ relname”的适当值,该值可直接在UPDATE语句中用作:
UPDATE
Update <relname> set ...
在PL / pgSQL脚本中?
使用quote_ident(r.relname)如:
quote_ident(r.relname)
Update quote_ident(r.relname) Set ...
失败与:
“(”或附近的语法错误LINE 55:UPDATE quote_ident(r.relname)…。
我正在使用的完整代码:
CREATE FUNCTION merge_children_of_icd9 (ocicd9 text, ocdesc text, ncicd9 text, ncdesc text) RETURNS void AS $BODY$ DECLARE r RECORD; BEGIN FOR r IN WITH fk_actions ( code, action ) AS ( VALUES ('a', 'error'), ('r', 'restrict'), ('c', 'cascade'), ('n', 'set null'), ('d', 'set default') ), fk_list AS ( SELECT pg_constraint.oid AS fkoid, conrelid, confrelid::regclass AS parentid, conname, relname, nspname, fk_actions_update.action AS update_action, fk_actions_delete.action AS delete_action, conkey AS key_cols FROM pg_constraint JOIN pg_class ON conrelid = pg_class.oid JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid JOIN fk_actions AS fk_actions_update ON confupdtype = fk_actions_update.code JOIN fk_actions AS fk_actions_delete ON confdeltype = fk_actions_delete.code WHERE contype = 'f' ), fk_attributes AS ( SELECT fkoid, conrelid, attname, attnum FROM fk_list JOIN pg_attribute ON conrelid = attrelid AND attnum = ANY(key_cols) ORDER BY fkoid, attnum ), fk_cols_list AS ( SELECT fkoid, array_agg(attname) AS cols_list FROM fk_attributes GROUP BY fkoid ) SELECT fk_list.fkoid, fk_list.conrelid, fk_list.parentid, fk_list.conname, fk_list.relname, fk_cols_list.cols_list FROM fk_list JOIN fk_cols_list USING (fkoid) WHERE parentid = 'icd9'::regclass LOOP RAISE NOTICE 'now in loop. relname is %', quote_ident(r.relname); RAISE NOTICE 'cols_list[1] is %', quote_ident(r.cols_list[1]); RAISE NOTICE 'cols_list[2] is %', quote_ident(r.cols_list[2]); RAISE NOTICE 'now doing update'; UPDATE quote_ident(r.relname) SET r.cols_list[1] = ncicd9, r.cols_list[2] = ncdesc WHERE r.cols_list[1] = ocicd9 AND r.cols_list[2] = ocdesc; RAISE NOTICE 'finished update'; END LOOP; RETURN; END $BODY$ LANGUAGE plpgsql VOLATILE; -- select merge_children_of_icd9('', 'aodm type 2', '', 'aodm, type 2');
我敢肯定这种事情经常发生,但是我似乎无法使用PostgreSQL找到类似的东西。有没有更好的办法?
在UPDATEPL / pgSQL的语句中,表名必须以文字形式给出。如果要动态设置表名和列,则应使用以下EXECUTE命令并将查询字符串粘贴到一起:
EXECUTE
EXECUTE 'UPDATE ' || quote_ident(r.relname) || ' SET ' || quote_ident(r.cols_list[1]) || ' = $1, ' || quote_ident(r.cols_list[2]) || ' = $2' || ' WHERE ' || quote_ident(r.cols_list[1]) || ' = $3 AND ' || quote_ident(r.cols_list[2]) || ' = $4' USING ncicd9, ncdesc, ocicd9, ocdesc;
该USING子句只能用于替代数据值,如上所述。
USING