0

PL/PGSQLの関数に問題があります。基本的に、私はクエリを持っています:

SELECT nspname AS schemaname,relname,reltuples
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE 
  nspname NOT IN ('pg_catalog', 'information_schema') AND
  relkind='r' and nspname='1' 
ORDER BY relname;

このクエリは、テーブルで開かれた行のデータベース統計を取得します。しかし、私たちのデータベースには膨大な量のスキーマがあります。そのクエリを使用してすべてのスキームを反復処理し、各スキームのテーブルで開かれる行の数を取得する関数を作成する必要があります。問題をグーグルで検索しようとしましたが、関連する例が見つかりませんでした。

4

2 に答える 2

3

関数で戻り値を定義できます。正しいデータ型を使用するか、型キャストを行う準備をすることを忘れないでください。

関数get_my_database_status()を作成または置換します
TABLE(schemaname name、relname name、reltuples real)ASを返します
$$
始める
   クエリを返す(SELECT N.nspname AS schemaname、C.relname、C.reltuples
       FROM pg_class C
       LEFT JOIN pg_namespace N ON(N.oid = C.relnamespace)
       WHERE N.nspname NOT IN('pg_catalog'、'information_schema')
       AND C.relkind='r'-ここではおそらくいくつかのフィルタリング
       relnameで注文);
終わり
$$
言語'plpgsql';

于 2012-07-25T20:41:10.143 に答える
3

力を使って、... err ...マニュアルを読んでください!

ただし、この場合、凝ったロジックは必要ありませんが、関数内にラップされるSQLクエリは1つだけなので、プレーンなSQL関数で十分です。

ここで使用される唯一の追加機能は、タイプのコピーです。

create or replace function get_my_database_status2()
returns table(schemaname pg_namespace.nspname%type, 
              relname    pg_class.relname%type, 
              reltuples  pg_class.reltuples%type)
as $$
  SELECT N.nspname, C.relname, C.reltuples
    FROM pg_class C
    LEFT JOIN pg_namespace N ON N.oid = C.relnamespace
   WHERE N.nspname NOT IN ('pg_catalog', 'information_schema') 
     AND C.relkind = 'r' -- here maybe some filtering
   ORDER BY relname;
$$ language sql;
于 2012-07-26T06:16:04.670 に答える