3

誰でもこれで私を助けることができますか?PostgreSQL(plpgsql言語)で指定されたテーブル名からHTMLテーブルを生成する関数を作成するタスクがあります。私はこれを書きましたが、それは私が必要とするものとはかけ離れています。私が与える列のテーブルを生成します (現時点では 1 つだけです) が、テーブルに名前を付けるだけで済みます。

CREATE OR REPLACE FUNCTION genhtml2(tablename text, columnname text)
RETURNS text AS $BODY$ DECLARE result text := ''; searchsql テキスト:= ''; var_match テキスト := ''; BEGIN searchsql := 'SELECT' || || 列名 || ' から ' || || テーブル名 || '';

result := '<table>';
FOR var_match IN EXECUTE(searchsql) LOOP
    IF result > '' THEN
        result := result || '<tr>' || var_match || '</tr>';
    END IF;
END LOOP;
result :=  result || '</table>';

結果を返します。終わり; $BODY$ LANGUAGE 'plpgsql' 不変;

4

4 に答える 4

3

メンテナンスの悪夢になる可能性があるため、これを行うべきではないと確信しています。最善の方法は、行の結果を任意のアプリケーションまたは別のレイヤーに返し、そこから html に向かって作業することです。

于 2010-11-24T09:34:17.333 に答える
3

これは、列名に text[] 配列を使用して複数の列で動作する修正版です。また、出力をフォーマットするために新しい行とタブを出力します。

CREATE OR REPLACE FUNCTION genhtml(text, text, text, text[])
  RETURNS text AS $BODY$ 

DECLARE 
  schemaname ALIAS FOR $1;
  tablename ALIAS FOR $2;
  tabletype ALIAS FOR $3;
  columnnames ALIAS FOR $4;
  result TEXT := ''; 
  searchsql TEXT := ''; 
  var_match TEXT := ''; 
  col RECORD;
  header TEXT;

BEGIN

  header := E'\t' || '<tr>' || E'\n';
  searchsql := $QUERY$SELECT ''$QUERY$;
  FOR col IN SELECT attname 
    FROM pg_attribute AS a 
    JOIN pg_class AS c ON a.attrelid = c.oid 
    WHERE c.relname = tablename
        AND n.nspname = schemaname
        AND c.relkind = tabletype
        AND attnum > 0 
        AND attname = ANY(columnnames)
  LOOP
    header := header || E'\t\t' || '<th>' || col || '</th>' || E'\n';
    searchsql := searchsql || $QUERY$ || E'\n\t\t' || '<td>' || $QUERY$ || col ||     $QUERY$ || '</td>' $QUERY$;
  END LOOP;
  header := header || E'\t' || '</tr>' || E'\n';

  searchsql := searchsql || ' FROM ' || schemaname || '.' || tablename;

  result := '<table>' || E'\n';
  result := result || header;
  FOR var_match IN EXECUTE(searchsql) LOOP
    IF result > '' THEN
      result := result || E'\t' || '<tr>' || var_match || E'\n\t' || '</tr>' || E'\n';
    END IF;
  END LOOP;
  result :=  result || '</table>' || E'\n';

  RETURN result; 

END; 
$BODY$ 
  LANGUAGE 'plpgsql' VOLATILE;

次のような関数を呼び出します。

SELECT genhtml('public', 'tablenamehere', 'r', ARRAY['col1', 'col2', 'col3']);

「r」は通常のテーブル用です。代わりに VIEW を使用している場合は、'v' に変更します。

于 2011-11-17T00:08:42.587 に答える
2

最初にテーブル内の列のカラログを検索し、次にそれらを使用してクエリを生成し、テーブル ヘッダーを設定できます。

colsql := $QUERY$SELECT attname
                 FROM pg_attribute AS a JOIN pg_class AS c ON a.attrelid = c.oid
                 WHERE c.relname = '$QUERY$
          || tablename || $QUERY$' AND attnum > 0;$QUERY$;

header := '';
searchsql := $QUERY$SELECT ''$QUERY$;
FOR col IN EXECUTE colsql LOOP
    header := header || '<th>' || col || '</th>';
    searchsql := searchsql || $QUERY$||'<td>'||$QUERY$ || col;
END LOOP;

searchsql := searchsql || ' FROM ' || tablename;

-- rest of your function here

明らかに、これは面倒で壊れやすくなります...

于 2010-11-24T09:59:05.537 に答える