From: | Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com> |
---|---|
To: | Patrick B <patrickbakerbr(at)gmail(dot)com>, "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com> |
Cc: | rob stone <floriparob(at)gmail(dot)com>, pgsql-general <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: Plpgsql - Custom fields Postgres 9.5 |
Date: | 2016-12-15 01:34:24 |
Message-ID: | 12150649-db26-9774-01b4-5d64f1ffc055@aklaver.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On 12/14/2016 05:19 PM, Patrick B wrote:
>
>
> 2016-12-15 14:00 GMT+13:00 David G. Johnston <david(dot)g(dot)johnston(at)gmail(dot)com
> <mailto:david(dot)g(dot)johnston(at)gmail(dot)com>>:
>
> On Wed, Dec 14, 2016 at 5:12 PM, rob stone <floriparob(at)gmail(dot)com
> <mailto:floriparob(at)gmail(dot)com>>wrote:
>
>
> On Wed, 2016-12-14 at 17:00 -0700, David G. Johnston wrote:
> > On Wed, Dec 14, 2016 at 4:49 PM, Patrick B <patrickbakerbr(at)gmail(dot)com <mailto:patrickbakerbr(at)gmail(dot)com>>
> > wrote:
> > > ERROR: function logextract(integer, integer) does not exist
> > > LINE 1: select logextract(20160901,20161001);
> > >
> >
> > So change the constants you are passing into your function to text
> > (i.e., surrounding them with single quotes) so it matches the new
> > function signature.
> >
> > There exists an element of understanding the options you are being
> > given and adapting if something basic like this is overlooked.
> >
> > David J.
>
>
> 1) Have you run a \df+ and made sure the function has been created
> correctly?
>
>
> It was created originally using integer arguments - and thus was
> being called that way. It was intentionally changed to use "text"
> arguments per a suggestion but without any recognition that the call
> site needed to change as well - hence the error. Running \df+
> would give the expected output. What could be a problem is if the
> original function wasn't dropped so while the text arg'd one was
> created the actual call would still reference the old int arg'd
> version and any changes would not appear to have been made.
>
>
> 2) In your first post there is a single apostrophe after the execute
> instruction. Can't see the closing apostrophe but then my
> eyesight is
> not the best.
>
>
> I'd recommend using the "format" function but last time I did that
> the person I way trying to help got mad...
>
>
> 3) I've always found it easier to TO_CHAR a date column when
> using it
> for comparison purposes.
>
>
> I'm not following this "use text" approach at all...I get the
> logistics but PostgreSQL allows for comparison of date typed data...
>
> David J.
>
>
>
> I've done:
>
> 1. Deleted all the functions;
> 2. Created a new function:
>
> CREATE or REPLACE FUNCTION l_extract(date_end text))
>
> RETURNS void AS $$
>
>
> DECLARE
>
> date_start date := CURRENT_DATE;
>
>
> begin
>
> execute '
>
> COPY
>
> (
>
> SELECT
>
> uuid,
>
> clientid,
>
> *
>
> FROM
>
> logging
>
> WHERE
>
> logtime
>
> BETWEEN
>
> ' || date_start || '
>
> AND
>
> ' || date_end || '
>
> )
>
> TO ''/var/lib/postgresql/'|| date_start ||'_logs.csv''';
>
> end
>
> $$ language 'plpgsql';
>
>
> 3. Calling the function:
>
> select l_extract('20160901');
>
> select l_extract('2016-09-01'); --> doesn't work either
>
>
> 4. Error:
>
> ERROR: operator does not exist: timestamp without time zone
> >= integer
>
> LINE 13: BETWEEN
>
> ^
>
> HINT: No operator matches the given name and argument
> type(s). You might need to add explicit type casts.
>
> QUERY:
>
> COPY
>
> (
>
> SELECT
>
> uuid,
>
> clientid,
>
> *
>
> FROM
>
> logging
>
> WHERE
>
> logtime
>
> BETWEEN
>
> 2016-12-15
>
> AND
>
> 20160901
>
> )
>
> TO '/var/lib/postgresql/2016-12-15_logs.csv'
>
> CONTEXT: PL/pgSQL function iknock_log_extract(text) line 7
> at EXECUTE
>
>
> 5. \d+ logging:
>
> log_time | timestamp(3) without time zone
>
>
> 6. Query below works:
>
> SELECT
>
> uuid,
>
> clientid,
>
> *
>
> FROM
>
> logging
>
> WHERE
>
> logtime
>
> BETWEEN
>
> '2016-12-15'
>
> AND
>
> '20160901'
>
>
> Still can't understand what's going on =\
Reading the suggestions might help:)
Another try:
CREATE or REPLACE FUNCTION l_extract(date_start text, date_end text))
RETURNS void AS $$
begin
execute '
COPY
(
SELECT
uuid,
clientid,
*
FROM
logging
WHERE
logtime
BETWEEN
date_start
AND
date_end
)
TO ''/var/lib/postgresql/'|| date_start ||'_logs.csv''';
end
$$ language 'plpgsql';
select l_extract('201611015', '201612015');
--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com
From | Date | Subject | |
---|---|---|---|
Next Message | David G. Johnston | 2016-12-15 01:36:23 | Re: Plpgsql - Custom fields Postgres 9.5 |
Previous Message | armand pirvu | 2016-12-15 01:29:03 | Re: Plpgsql - Custom fields Postgres 9.5 |