Re: Automate copy - Postgres 9.2

From: Melvin Davidson <melvin6925(at)gmail(dot)com>
To: rob stone <floriparob(at)gmail(dot)com>
Cc: Patrick B <patrickbakerbr(at)gmail(dot)com>, Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>, "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>, John R Pierce <pierce(at)hogranch(dot)com>, "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: Automate copy - Postgres 9.2
Date: 2016-06-14 02:24:44
Message-ID: CANu8FizyF7GvsNPW+KiQqZ_hgbVZ_vrgJHcxcTWS9qSGhJ68Zw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Mon, Jun 13, 2016 at 10:07 PM, rob stone <floriparob(at)gmail(dot)com> wrote:

> On Tue, 2016-06-14 at 13:33 +1200, Patrick B wrote:
> >
> >
> > 2016-06-14 9:47 GMT+12:00 Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>:
> > > On 06/13/2016 02:42 PM, Patrick B wrote:
> > > > Hi guys,
> > > >
> > > > I created this function:
> > > >
> > > > CREATE or REPLACE FUNCTION function(account_id
> > > > integer)
> > > >
> > > > RETURNS void AS $$
> > > >
> > > > begin
> > > >
> > > > execute 'COPY
> > > >
> > > > (
> > > >
> > > > SELECT * FROM backup_table WHERE account_id = ' ||
> > > > account_id || 'AND status = 1
> > > >
> > > > )
> > > >
> > > > TO ''/var/lib/pgsql/'||account_id||'.sql''';
> > > >
> > > > end
> > > >
> > > > $$ language 'plpgsql';
> > > >
> > > >
> > > >
> > > > The function works fine.. but is not what I need, actually.
> > > > The function above works by calling it specifying the account_id.
> > > > For
> > > > example:
> > > >
> > > > You want to copy ( backup ) for the account_id number 63742:
> > > >
> > > > select function(63742);
> > > >
> > > >
> > > > *What I need is:*
> > > >
> > > > When calling the function, I have to specify the limit of
> > > > account_ids to
> > > > be copied. For example:
> > > > To perform the commands in the function to 40 different
> > > > account_ids:
> > > >
> > > > select function (40);
> > > >
> > > >
> > > >
> > > > How can I do that? I can't...
> > > >
> > >
> > > I believe this has been asked and answered, namely there needs to
> > > be further information on how you want to determine the account ids
> > > to be selected.
> > >
> >
> > The account_ids can be random.. does not need to have an order, as
> > they all will be copied some day.
> >
> > There are more than 1.000.000 million rows in that backup table (
> > attachments: as pictures, pdfs, etc ), and that's why I can't specify
> > the account_Id manually.. and also need a limit, so the server won't
> > stop while performing the COPY
> >
> > > - Also, each file must have the account_id's name. Example for the
> > > account_id = 124134
> > > 124134.sql
> >
> > Please, if you guys could give a help here..
> > Cheers
> > P.
>
>
> 1) COPY TO produces a text file and having a file created with a suffix
> of SQL is slightly misleading. You can specify delimiter and
> encapsulation characters. So, a suffix of csv is more appropriate.
>
> 2) Assuming backup_table is static and nobody is inserting or updating
> data, you just need to read the rows and write out the million or so
> individual files. If it's not static, you'll have to update (or delete)
> the rows written to file, perhaps SET status = 2, so that you don't
> write the same file multiple times.
>
> 3) If you are worried about throttling, put a pause into the program
> looping through backup_table. You have to write a program to read
> backup_table in order to supply your function with an account_id.
>
>
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general
>

It sounds to me like you are over complicating the problem.
You should make the function accept two parameters, a start and a stop id.
eg: CREATE or REPLACE FUNCTION function(start_account_id integer,
end__account_id)

Then you can modify it to fetch through a temp table table of just the
account_id's you need.

eg:
DECLARE
refcur refcursor;

BEGIN
CREATE TEMP TABLE accts_to_copy
AS SELECT account_id from backup_table
WHERE account_id >= start_account_id
AND account_id <= end_account_id;

<some_labe>
FOR account_id IN refcur
SELECT account_id FROM accts_to_copy LOOP
do_your_copy
END LOOP <some_labe>;

--
*Melvin Davidson*
I reserve the right to fantasize. Whether or not you
wish to share my fantasy is entirely up to you.

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Edson Richter 2016-06-14 02:36:52 Re: Index seems "lost" after consecutive deletes
Previous Message rob stone 2016-06-14 02:18:40 Re: Index seems "lost" after consecutive deletes