On Tue, Dec 2, 2014 at 2:25 PM, Adrian Klaver <adrian.kla...@aklaver.com>
wrote:

> On 12/02/2014 10:40 AM, Nelson Green wrote:
>
>> On Tue, Dec 2, 2014 at 11:57 AM, Merlin Moncure <mmonc...@gmail.com
>> <mailto:mmonc...@gmail.com>> wrote:
>>
>
>
>> Hi Merlin,
>>
>> I'm afraid I'm only confusing things, so let me give an example of what I
>> am
>> trying to do:
>>
>> -- Example
>> --------------------------------------------------------------------
>> CREATE OR REPLACE FUNCTION check_interval(_period TEXT, _unit TEXT)
>> RETURNS INTERVAL
>> AS $$
>>     DECLARE
>>        _DEFAULT_INTERVAL INTERVAL            := '1 HOUR';
>>
>>        BEGIN
>>           -- Create a temporary table that maintains the time intervals:
>>           CREATE TEMPORARY TABLE interval_period
>>           (
>>              interval_unit    TEXT      NOT NULL
>>           );
>>
>>           INSERT INTO interval_period
>>           VALUES
>>           ('microsecond'),
>>           ('microseconds'),
>>           ('millisecond'),
>>           ('milliseconds'),
>>           ('second'),
>>           ('seconds'),
>>           ('minute'),
>>           ('minutes'),
>>           ('hour'),
>>           ('hours'),
>>           ('day'),
>>           ('days'),
>>           ('week'),
>>           ('weeks'),
>>           ('month'),
>>           ('months'),
>>           ('year'),
>>           ('years'),
>>           ('decade'),
>>           ('decades'),
>>           ('century'),
>>           ('centurys'),
>>           ('millennium'),
>>           ('millenniums');
>>
>>           IF _period !~ '[1-9]\d*'
>>           THEN
>>              DROP TABLE interval_period;
>>              RETURN _DEFAULT_INTERVAL;
>>           END IF;
>>
>>           IF LOWER(_unit) NOT IN (SELECT interval_unit
>>                                   FROM interval_period)
>>           THEN
>>              DROP TABLE interval_period;
>>              RETURN _DEFAULT_INTERVAL;
>>           END IF;
>>
>>           DROP TABLE interval_period;
>>           RETURN CAST(CONCAT(_period, _unit) AS INTERVAL);
>>
>>        END;
>> $$
>> LANGUAGE PLPGSQL;
>> -- End Example
>> ----------------------------------------------------------------
>>
>> In the line: IF LOWER(_unit) NOT IN (SELECT interval_unit ..., I would
>> rather
>> query a catalog table for the interval unit names if possible. That
>> would then
>> compensate for any changes to those values in the future.
>>
>> When I meant do this in C, I was referring to rewriting this function in C
>> instead of Pl/pgSQL.
>>
>> I hope this helps you understand what I am asking, and apologies for not
>> being
>> more specific up front.
>>
>
> Would it not be easier to just try the CAST and then catch the exception
> and handle it:
>
> http://www.postgresql.org/docs/9.3/interactive/plpgsql-
> control-structures.html#PLPGSQL-ERROR-TRAPPING
>

Thanks Adrian, for putting my head back on straight.

Not only would that be at least as easy, I have done similar error trapping
in
other functions. Not to sure how I got off on this tangent and then stuck
with
it. Guess I was trying to make this way harder than it needed to be, or I
had
way too much turkey over the past holiday?

And a big thanks to everyone that took time to work with me too.

Regards,
Nelson


>
>
>> Regards,
>> Nelson
>>
>>     merlin
>>
>>
>>
>
> --
> Adrian Klaver
> adrian.kla...@aklaver.com
>

Reply via email to