2010-11-24 5 views
2

누구든지 이걸 도와 줄 수 있어요. PostgreSQL (plpgsql 언어)에서 주어진 테이블 이름으로 html 테이블을 생성하는 함수를 사용하는 작업이 있습니다. 나는 이것을 작성했지만, 내가 필요한 것에서 멀리 떨어져있다. 그것은 줄 (지금은 하나)에 대한 테이블을 생성하지만, 난 그냥 테이블 이름을 줄 필요가있다.PostgreSQL 함수에서 HTML을 생성하십시오

$ DECLARE 결과 텍스트를 생성하거나 $ BODY 펑션 genhtml2 (TABLENAME 텍스트 기둥 이름 텍스트)
RETURNS 텍스트를 바꾸기 : = ""; searchsql text : = ''; var_match 텍스트 : = ''; BEGIN searchsql : = 'SELECT'|| columnname || ' FROM'|| tablename || '';

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>'; 

return 결과; 종료; $ BODY $ LANGUAGE 'plpgsql'IMMUTABLE;

+0

해당 함수에'IMMUTABLE' 한정자를 사용하지 마십시오! PostgreSQL은 안전하지 않은 최적화를 만들 수 있습니다. 읽기 : http://www.postgresql.org/docs/9.0/interactive/xfunc-volatility.html – intgr

+0

psql에 -H html 스위치가 있다는 것을 알고 있습니까? 'psql -H -c'select * from table'.' –

답변

1

테이블의 칼럼을 먼저 검색 한 다음 쿼리를 생성하고 테이블 헤더를 설정하는 데 사용할 수 있습니다. 분명히이 지저분하고 빠른 취성 도착

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 

...

+0

이것은 많은 구문 오류를 제공하며 아마도 초보자도 할 수 있습니다. 그 (것)들을 잘 취급하십시오 – Adomas

+0

좋은, 나는 그것을, 일했다 감사합니다 – Adomas

3

잠재적 인 유지 관리 악몽이기 때문에이 작업을해서는 안됩니다. 가장 좋은 방법은 행 결과를 응용 프로그램 또는 다른 계층으로 반환하고 거기에서부터 html로 작업하는 것입니다.

+0

분명히 하겠지만, plpgsql에서 정확히 수행해야 할 작업은 다음과 같습니다. ( – Adomas

+0

ok 1)이 스크립트는 생성하는 것으로 보입니다 행 (나는 트로피가 아니라 td를 보았습니다) –

+0

글쎄, 여기에 하나의 컬럼 만 기능을 부여하고 있지만, 나는 td를 필요로하지 않습니다. 그러나 그 아이디어는 필자가 컬럼 이름을 부여해서는 안되며, 함수가 그것들을 찾아야 만한다는 것을 의미한다. 나는 td를 – Adomas

1

여기에 열 이름에 대한 텍스트 [] 배열을 사용하여 여러 열이 작동하는 수정 된 버전입니다. 또한 새로운 행과 탭을 인쇄하여 출력 형식을 지정합니다.

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'로 변경하십시오.

관련 문제