例:
Table=["category1","category2","category3"]
for varTable in Table:
cr.execute('update varTable SET id=%s,WHERE id=%s)
........
....
このループを行う方法は?
例:
Table=["category1","category2","category3"]
for varTable in Table:
cr.execute('update varTable SET id=%s,WHERE id=%s)
........
....
このループを行う方法は?
そのために動的SQLを使用します。デフォルトでは、plpgsqlを。とともに使用しEXECUTE
ます。
関数を作成するか、DO
アドホック実行用のステートメントを使用します。
CREATE OR REPLACE FUNCTION f_up(_new_id int, _old_id int)
RETURNS void AS
$BODY$
DECLARE
_tbl text[] := '{category1,category2,category3}';
t text;
BEGIN
FOREACH t IN ARRAY _tbl
LOOP
EXECUTE '
UPDATE ' || t || '
SET id = $1
WHERE id = $2'
USING _new_id, _old_id;
END LOOP;
END;
$BODY$ LANGUAGE plpgsql;
電話:
SELECT f_up(23, 45);
SOにも同様の答えがたくさんあります。dynamic-sql、plpgsql、およびEXECUTE
その他の例と説明を検索してください。
plpgsqlがまだ黒魔術である場合は、データ変更CTEを使用して、この単純なケースを非常に効果的に解決できます。データ変更CTEにはPostgreSQL9.1が必要です。
WITH vals AS (
SELECT 23 AS new_id, 45 AS old_id -- provide values once
)
, a AS (
UPDATE category1
SET id = v.new_id
FROM vals v
WHERE id = v.old_id
)
, b AS (
UPDATE category2
SET id = v.new_id
FROM vals v
WHERE id = v.old_id
)
UPDATE category3
SET id = v.new_id
FROM vals v
WHERE id = v.old_id;