5

foreach私の目的は、テーブルの名前を配列に割り当て、この配列を介してループにドロップすることです。

私は実際にはもっと複雑なことをしようとしていますが、次のコードを機能させる前に:

CREATE OR REPLACE FUNCTION delete_auto()
  RETURNS void AS
$BODY$DECLARE
t text;
tbl_array text[] = array["ID: 889197824 CH: 0006 Messdaten2","ID: 889197824 CH: 0006 Messdaten3","ID: 889197824 CH: 0006 Messdaten4"];
BEGIN 

FOREACH t IN ARRAY tbl_array LOOP
DROP TABLE t;
END LOOP;
END; $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION delete_auto()
  OWNER TO postgres;

関数はかなり正しいように思えますが、テーブルを削除せず、実行後に実際には何もしません。ログに次のようなエラーが表示されます。

Table »t« does not exist. 

text[] の代わりに varchar[] を使用して同じコードを試しましたが、どちらも機能しませんでした。どんな助けでもいただければ幸いです

4

2 に答える 2

16

いくつかのエラーがあります:

  • 文字列リテラルに二重引用符を使用することはできません (大文字と小文字を区別する SQL 識別子に使用されます)。

  • パラメーター化された DDL ステートメント (ステートメント EXECUTE) には動的 SQL を使用する必要があります。DDL ステートメントには実行計画がなく、これらのステートメントはパラメーター化をサポートしていません (そこで変数を使用しないでください)

    やる $$
    宣言する
      テーブル varchar[] := ARRAY['t1','t2'];
      t varchar;
    始める
      FOREACH t IN ARRAY テーブル
      ループ
        EXECUTE format('DROP TABLE %I', t);
      エンドループ;
    終わり;
    $$;
    
于 2013-05-23T10:17:15.107 に答える