首页 文章

从PostgreSQL函数生成HTML

提问于
浏览
2

谁能帮我这个?我有一个编写函数的任务,它将从PostgreSQL中的给定表名生成HTML表(plpgsql语言) . 我写过这个,但它远非我所需要的 . 它会为我给出的列生成一个表(目前只有一个),但我需要给表一个名称 .

创建或替换函数genhtml2(tablename text,columnname text)RETURNS text AS $ BODY $ DECLARE result text:=''; searchsql text:=''; var_match text:=''; BEGIN searchsql:='SELECT'|| columnname || 'FROM'|| tablename || '';结果:='<table>';
FOR var_match IN EXECUTE(searchsql)LOOP
如果结果>''那么
结果:=结果|| '<tr>'|| var_match || '</ TR>';
万一;
结束循环;
结果:=结果|| '</ TABLE>';
返回结果;结束; $ BODY $ LANGUAGE'plpgsql'IMMUTABLE;

4 回答

  • 0

    您可以先在calalogs中搜索表中的列,然后使用它们生成查询并设置表头 .

    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
    

    显然这会变得凌乱脆弱......

  • 3

    我非常有信心你不应该这样做,因为这是一个潜在的维护噩梦 . 最好的办法是将行结果返回到任何应用程序或其他层,并从那里向html工作 .

  • 2

    这是一个修改后的版本,它使用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” .

  • 1

    小猪退出上面的其他答案,我修改了这个,因为我在上面列出的答案中发现了几个问题,其中包括:

    • 加入不正确;别名无效(即n)

    • 该函数无法处理空值

    • 函数应生成具有已定义的html文档类型的整个HTML文档

    注意:虽然必须在postgres中生成HTML文档并不理想,但有些情况可能需要这样做 . 我发现自己在 . 除了上面列出的问题,我还包括用于处理格式化和桌面上的CSS的引导程序 . 我希望这对其他人有帮助 .

    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 := '';
       varmatch TEXT := '';
       col RECORD; 
       html_doctype TEXT := '<!DOCTYPE html>' || E'\n'; 
       html_meta TEXT := '<meta charset="uft-8">' || E'\n\t' || '<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit="no">' || E'\n'; 
       html_link TEXT := '<link rel="stylesheet" href="boostrapCSSLinkHere.css">' || E'\n';
       html_bscript TEXT := '<script src="bootstraptScriptHere.js"> </script>' || E'\n';
       html_jscript TEXT := '<script src="jQueryScriptHere.js"> </script>' || E'\n'; 
       html_head TEXT := '<html>' || E'\n' || '<head>' || E'\n\t' || html_meta || E'\t' || hmtml_link || E'\t' || html_jscript ||  E'\t' || html_bscript || '</head>' || E'\n'; 
       html_body TEXT := '<body>';
       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
          JOIN pg_namespace AS n ON n.oid = c.relnamespace
          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\n\t' || '<td>' || $QUERY$ || 'coalesce(' || col || ', ''N/A'')' || $QUERY$ || '<td>' $QUERY$;
       END LOOP; 
    
       header := header || E'\t' || '<tr>' || E'\n'; 
       searchsql := searchsql || ' FROM ' || schemaname || '.' || tablename;
       result := html_doctype || html_head || html_body || E'\n\t' || '<table class="table table-striped table-hover">' || E'\n'; 
       result := result || header; 
    
       FOR varmatch IN EXECUTE (searchsql) LOOP
          IF result > '' THEN
             result := result || E'\t' || '<tr>' || varmatch || E'\n\t' || </tr> || E'\n';
          END IF;
       END LOOP;
       result := result || E'\t' || </table> || E'\n' || '</body> || E'\n' || '</html>'; 
    
       RETURN result; 
    
    END; 
    $body$
       LANGUAGE 'plpgsql' VOLATILE;
    

相关问题