From: | Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com> |
---|---|
To: | Denisa Cirstescu <denisa(dot)cirstescu(at)asentinel(dot)com> |
Cc: | "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: COPY value TO STDOUT |
Date: | 2017-01-14 17:02:30 |
Message-ID: | CAFj8pRDM-dBp+rCONTh9G3i42SEo6cj2z19aJQUqP0Xmwh9usw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Hi
2017-01-13 16:45 GMT+01:00 Denisa Cirstescu <denisa(dot)cirstescu(at)asentinel(dot)com>
:
> I am not sure if this is the correct mailing list or if this is how you
> submit a question, but I am going to give it a try.
>
>
>
> I want to COPY a value to STDOUT from PL/pgSQL language.
>
>
>
> I saw that the STDOUT is not accessible from PL/pgSQL, but it is from SQL.
>
> This is why I am trying to create an auxiliary function declared as
> language SQL and call that function from my PL/pgSQL code.
>
>
>
> This is an example of PL/pgSQLcode:
>
>
>
> *DO *
>
> *$do$*
>
> *BEGIN*
>
> * perform printToStdout('12');*
>
> * perform printToStdout('34');*
>
> * perform printToStdout('56');*
>
> *END *
>
> *$do$*
>
>
>
> And this is the definition of the auxiliary function:
>
>
>
> *create or replace function printToStdout(abc text) returns void as $$*
>
> * copy (SELECT abc) to stdout;*
>
> *$$ language sql;*
>
>
>
>
>
> However, this is not working, because COPY doesn’t know how to use the
> value of my variable named abc and it returns the error:
>
> ERROR: column "abc" does not exist
>
> If I use a constant, instead of the abc variable everything works fine;
> the constant is printed to STDOUT.
>
>
>
> Is there a way to achieve this without using an auxiliary table?
>
> The below code does the job, but is not ok for me because of the auxiliary
> table that might cause performance problems in a concurrent environment
> with a lot of requests:
>
>
>
> *create table if not exists printToStdoutTable(abc text);*
>
>
>
> *create or replace function printToStdout(abc text) returns void as $$*
>
> * delete from printToStdoutTable;*
>
> * insert into printToStdoutTable values(abc);*
>
> * copy (SELECT * from printToStdoutTable) to stdout;*
>
> *$$ language sql;*
>
You cannot do it in plain text language.
The identifier of column or table have not be a variable ever.
You can use dynamic SQL in PLpgSQL - where SQL command is created in
run-time and there you can do what you want.
Use plpgsql and EXECUTE statement
https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN
Regards
Pavel Stehule
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2017-01-14 17:03:23 | Re: Timestamp index not being hit |
Previous Message | ProPAAS DBA | 2017-01-14 16:29:54 | raise notice question |