私の主な目的は、実際には、すべてのテーブル名に「Messdaten」が含まれていることをフィルタリングし(たとえば、「ID:843063334 CH:0001 Messdaten」)、「create tableas」コマンドを「Backup_Messdaten1」、「Backup_Messdaten2」として使用して新しいテーブルを作成することです'など。
最初に、フィルタリングせずにすべてのテーブル名を格納しようとしました(すべてのテーブル名を取得し、SQLクエリによって「Messdaten」を含む方法があるかもしれませんが、わかりません)、次に「Messdaten」を含むものを格納します別の配列を作成し、その新しい配列を「createtableas」コマンドで使用します。
しかし、私が言ったように、私の最初の目標は、すべてのテーブル名を配列に格納することです。
コード自体;
CREATE OR REPLACE FUNCTION retrieve()
RETURNS text[] AS
$BODY$DECLARE
tbl_names text[];
BEGIN
tbl_names := array(SELECT table_name FROM information_schema.tables WHERE
table_schema='public' AND table_type='BASE TABLE');
SELECT tbl_names[i] FROM generate_subscripts(tbl_names, 1) g(i);
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION retrieve()
OWNER TO postgres;
しかし、上記のコードでは、このようなエラーが発生します。
エラー;
ERROR: could not find array type for data type information_schema.sql_identifier
SQL state: 42704
Context: SQL statement "SELECT array(SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE')"
PL/pgSQL function retrieve() line 4 at assignment
何が悪いのか分かりますか?ちなみに私の主な目的を説明しましたが、その目的に関して正しい方向を示していただければ幸いです。
SELECT array_agg(table_name::text)
FROM information_schema.tables
WHERE table_schema='public' AND table_type='BASE TABLE';
テーブル名をにキャストする必要がありますtext
。サブクエリは不要でありarray_agg
、array
疑似関数ではなく使用する必要があります。
個人的には、なぜそれらを配列に集約する必要があるのかまったくわかりません。私はただ:
DECLARE
tablename text;
BEGIN
FOR tablename IN
SELECT table_name FROM information_schema.tables
WHERE table_schema='public' AND table_type='BASE TABLE'
AND ... my extra filters here ...
LOOP
EXECUTE format('CREATE TABLE %I AS TABLE %I', tablename || '_backup', tablename);
END LOOP;
END;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加