sql >> データベース >  >> RDS >> PostgreSQL

テーブル名である変数から選択する方法nPostgre>=9.2

    正解はAntonKovalenkoからのコメントです

    埋め込みSQLでテーブル名または列名として変数を使用することはできません。

    UPDATE dynamic_table_name SET ....
    

    PostgreSQLは、埋め込みSQL用に準備および保存されたプランを使用し、ターゲットオブジェクト(テーブル)への参照はプランに深くハードエンコードされています(一部の特性はプランに大きな影響を与えます)。1つのテーブルはインデックスとして使用でき、他のテーブルは使用できません。クエリプランニングは比較的遅いため、PostgreSQLは透過的に試行しません(いくつかの例外はありません)。

    動的SQLを使用する必要があります -1つの目的は、同様の状況で使用することです。常に新しいSQL文字列を生成し、計画は保存されません

    DO $$
    DECLARE r record;
    BEGIN
      FOR r IN SELECT table_name 
                  FROM information_schema.tables
                 WHERE table_catalog = 'public'
      LOOP
        EXECUTE format('UPDATE %I SET id = 10 WHERE id = 15', r.table_name);
      END LOOP;
    END $$;
    

    重要:動的SQLは安全ではありませんSQLインジェクションがあります リスク)パラメータのサニタイズなし。関数「format」を使用しました 「それのために。他の方法は「quote_ident」を使用することです 「機能。

    EXECUTE 'UPDATE ' || quote_ident(r.table_name) || 'SET ...
    



    1. ROracleパッケージをWindows7にインストールするにはどうすればよいですか?

    2. SQLException:結果セットの開始前

    3. MySQL:トリガーで区切り文字を使用するにはどうすればよいですか?

    4. C#/ Oracle:クエリのエンコーディング/文字セットを指定しますか?