Re: Crosstab function - Mailing list pgsql-general

From Sim Zacks
Subject Re: Crosstab function
Date
Msg-id 536A19E2.70607@compulab.co.il
Whole thread Raw
In response to Re: Crosstab function  ("Hengky Liwandouw" <hengkyliwandouw@gmail.com>)
Responses Re: Crosstab function
List pgsql-general
<meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
    body p { margin-bottom: 0cm; margin-top: 0pt; }

  <body style="direction: ltr;"
    bidimailui-detected-decoding-type="latin-charset" bgcolor="#FFFFFF"
    text="#000000">
    What I have done in the past to build a
      generic reporting application is to have the function write the
      results you want in a table and return the tablename and then have
      the client code call select * from that table.

      My standard report tablename is tblreport || userid;
      It gets dropped at the beginning of the function, so it is
      basically a temp table that doesn't interfere with any other
      users.

      Example:
          execute 'drop table if exists reports.tblreport' || v_userid ;
          execute 'drop sequence if exists reports.tblreport' ||
      v_userid || '_id_seq; create sequence reports.tblreport' ||
      v_userid || '_id_seq';
          v_sql=' create table reports.tblreport' || v_userid || ' as ';

      Sim

      On 05/06/2014 06:37 AM, Hengky Liwandouw wrote:

    <blockquote cite="mid:004601cf68dc$848e8420$8dab8c60$@com"
      type="cite">
      Very Clear instruction !

Thank you very much David. I will do it in my client app and follow your
guidance.


-----Original Message-----
From: pgsql-general-owner@postgresql.org
[mailto:pgsql-general-owner@postgresql.org] On Behalf Of David G Johnston
Sent: Tuesday, May 06, 2014 11:01 AM
To: pgsql-general@postgresql.org
Subject: Re: [GENERAL] Crosstab function

Hengky Lie wrote


        Hi David,

Are you sure that there is no pure sql solution for this ?

I think (with my very limited postgres knowledge), function can solve
this.

Which is the column header I need but I really have no idea how to use
this
as column header.

Anyway, If i can't do this in postgres, I will try to build sql string in
the client application (Windev) and send the fixed sql to the server



Positive.

You could build the necessary string in a pl/pgsql language function but you
would still have trouble getting the data out of the function the way you
want; unless you output a single text column no matter the original data (
basically output a cvs version of the crosstab result).

There is no dynamic execution in SQL so even though you can get a string
that looks like what you want you cannot do anything with it.  Only data is
allowed to be dynamic; the engine has to know the names and types of all
schema objects before it can start so there is no way a query can retrieve
these things from its own data. It's the whole cart-horse thing...

The solution is to build the query in the client and send it.  Make sure you
look at the various "quote_" functions in order to minimize the risk of SQL
injection attacks.  These are especially useful for pl/pgsql functions but
you might be able to use them in your first query so that you can avoid
coding all the quoting and escaping rules into your application.  At minimum
double-quote all your identifiers and make sure there are no unescaped
embedded double-quotes.  If the only variables are from data in tables
putting constraints on those tables would probably be useful as well - you
limit valid identifiers but minimized risk of bad data causing an issue.

David J.








--
View this message in context:
http://postgresql.1045698.n5.nabble.com/Crosstab-function-tp5802402p5802601.
html
Sent from the PostgreSQL - general mailing list archive at Nabble.com.

pgsql-general by date:

Previous
From: Serge Fonville
Date:
Subject: Re: Oracle to PostgreSQL replication
Next
From: David G Johnston
Date:
Subject: Re: any psql \copy tricks for default-value columns without source data?