Hi

2017-01-13 16:45 GMT+01:00 Denisa Cirstescu <denisa.cirste...@asentinel.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

Reply via email to