Обсуждение: Few Queries
Hi ,
I'm still facing few problems and hence the query . I have searched the archives as well as read the manual.
1. I 'm firing a query and it returns the value in variable which I need to pass to other query . Is this a right way to pass the value ? I'm newbie to this Database and hence facing lot of syntax problems.
CREATE FUNCTION del_old_history() RETURNS bool AS '
declare
var_history_age_limit int4;
set_time datetime;
BEGIN
select into var_history_age_limit history_age_limit from database_info;
IF (var_history_age_limit is not null) THEN
set_time := select current_date()+ INTERVAL ' ' $var_history_age_limit day' ';
declare
var_history_age_limit int4;
set_time datetime;
BEGIN
select into var_history_age_limit history_age_limit from database_info;
IF (var_history_age_limit is not null) THEN
set_time := select current_date()+ INTERVAL ' ' $var_history_age_limit day' ';
--begin transaction
delete from history where complete_time <= set_time;
END IF;
delete from history where complete_time <= set_time;
END IF;
return true;
END;'
LANGUAGE 'plpgsql';
LANGUAGE 'plpgsql';
I get this error :
Error: ERROR: parser: parse error at or near "select"
NOTICE: Error occurred while executing PL/pgSQL function del_old_history
NOTICE: line 8 at assignment
2. Is there any equiavlent of MS -SQLServer 'trancount ' in postgres ?
3. if object_id ('database_info') is null
how is above statement verified in postgres . I tried looking for OID .
Any help will be highly appreciated.
Regards,
-Sugandha
Am Mittwoch, 14. August 2002 07:05 schrieb Sugandha Shah:
> 1. I 'm firing a query and it returns the value in variable which I
> need to pass to other query . Is this a right way to pass the
> value ? I'm newbie to this Database and hence facing lot of
> syntax problems.
>
> CREATE FUNCTION del_old_history() RETURNS bool AS '
> declare
> var_history_age_limit int4;
> set_time datetime;
> BEGIN
> select into var_history_age_limit history_age_limit from
> database_info; IF (var_history_age_limit is not null) THEN
> set_time := select current_date()+ INTERVAL ' '
If you do a aselect you need select into. Normal assignment is only
possible with simple expression. Try:
SELECT INTO set_time current_date()+ INTERVAL ' ';
> 2. Is there any equiavlent of MS -SQLServer 'trancount ' in
> postgres ?
you should only post one question per mail and i dont know waht
trancount is.
do you mean something like getting the affected rows?
Look at this file in the postgresdocs (7.2.1)
plpgsql-statements.html#PLPGSQL-STATEMENTS-DIAGNOSTICS
> 3. if object_id ('database_info') is null
> how is above statement verified in postgres . I tried looking
> for OID .
same as answer to question number 2.
something like
GET DIAGNOSTICS var_oid = RESULT_OID;
IF var_oid IS NULL THEN
janning
--
PLANWERK 6 /websolutions
Herzogstraße 86
40215 Düsseldorf
fon 0211-6015919
fax 0211-6015917
http://www.planwerk6.de
Hi ,
No luck . Even with Select Into . Please if any body has faced similar problem and knows a solution.
CREATE FUNCTION del_old_history() RETURNS int4 AS '
declare
var_history_age_limit int4;
set_time datetime;
declare
var_history_age_limit int4;
set_time datetime;
BEGIN
select into var_history_age_limit history_age_limit from database_info;
IF (var_history_age_limit is not null) THEN
--set_time :=select current_date()+ INTERVAL '1 day');
select into set_time current_date()+ INTERVAL ''$var_history_age_limit days '';
select into var_history_age_limit history_age_limit from database_info;
IF (var_history_age_limit is not null) THEN
--set_time :=select current_date()+ INTERVAL '1 day');
select into set_time current_date()+ INTERVAL ''$var_history_age_limit days '';
delete from history where complete_time <= set_time;
END IF;
END IF;
return true;
END;'
LANGUAGE 'plpgsql';
LANGUAGE 'plpgsql';
Regards,
-Sugandha
----- Original Message -----
From: "Janning Vygen" <vygen@gmx.de>
To: "Sugandha Shah" <Sugandhas@cybage.com>; <pgsql-sql@postgresql.org>
Sent: Wednesday, August 14, 2002 12:32 PM
Subject: Re: [SQL] Few Queries
> > 1. I 'm firing a query and it returns the value in variable which I
> > need to pass to other query . Is this a right way to pass the
> > value ? I'm newbie to this Database and hence facing lot of
> > syntax problems.
> >
> > CREATE FUNCTION del_old_history() RETURNS bool AS '
> > declare
> > var_history_age_limit int4;
> > set_time datetime;
> > BEGIN
> > select into var_history_age_limit history_age_limit from
> > database_info; IF (var_history_age_limit is not null) THEN
> > set_time := select current_date()+ INTERVAL ' '
>
> If you do a aselect you need select into. Normal assignment is only
> possible with simple expression. Try:
>
> SELECT INTO set_time current_date()+ INTERVAL ' ';
>
> > 2. Is there any equiavlent of MS -SQLServer 'trancount ' in
> > postgres ?
>
> you should only post one question per mail and i dont know waht
> trancount is.
>
> do you mean something like getting the affected rows?
> Look at this file in the postgresdocs (7.2.1)
> plpgsql-statements.html#PLPGSQL-STATEMENTS-DIAGNOSTICS
>
> > 3. if object_id ('database_info') is null
> > how is above statement verified in postgres . I tried looking
> > for OID .
>
> same as answer to question number 2.
> something like
> GET DIAGNOSTICS var_oid = RESULT_OID;
> IF var_oid IS NULL THEN
>
> janning
>
> --
> PLANWERK 6 /websolutions
> Herzogstraße 86
> 40215 Düsseldorf
>
> fon 0211-6015919
> fax 0211-6015917
> http://www.planwerk6.de
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>
On Wed, 2002-08-14 at 13:29, Sugandha Shah wrote:
> Hi ,
>
> No luck . Even with Select Into . Please if any body has faced similar problem and knows a solution.
>
> CREATE FUNCTION del_old_history() RETURNS int4 AS '
^^^^^^^^^^^^^
> declare
> var_history_age_limit int4;
> set_time datetime;
>
> BEGIN
> select into var_history_age_limit history_age_limit from database_info;
> IF (var_history_age_limit is not null) THEN
>
> --set_time :=select current_date()+ INTERVAL '1 day');
> select into set_time current_date()+ INTERVAL ''$var_history_age_limit days '';
> delete from history where complete_time <= set_time;
> END IF;
> return true;
^^^^^^^^^^^
> END;'
> LANGUAGE 'plpgsql';
You don't seem to be returning what you have selected. I would expect
"RETURN true;" to give you an error. Shouldn't that be "RETURN
var_history_age_limit;"?
--
Oliver Elphick Oliver.Elphick@lfix.co.uk
Isle of Wight, UK
http://www.lfix.co.uk/oliver
GPG: 1024D/3E1D0C1C: CA12 09E0 E8D5 8870 5839 932A 614D 4C34 3E1D 0C1C
======================================== "Let us therefore come boldly unto the throne of grace, that we may
obtainmercy, and find grace to help in time of need." Hebrews 4:16
On Wednesday 14 Aug 2002 1:29 pm, Sugandha Shah wrote: > Hi , > > No luck . Even with Select Into . Please if any body has faced similar > problem and knows a solution. You don't need select into here - the sample below deletes everything older than one day. You should be able to adapt it to your needs. Your example had a + rather than a - which would delete things in the future, that might have been what you intended, or it might not. The RAISE NOTICE line prints a useful debug value. I like to scatter these around while I'm testing. CREATE FUNCTION del_old_history() RETURNS int4 AS ' DECLARE var_history_age_limit int4; set_time timestamp; BEGIN var_history_age_limit:=1; set_time := current_date() - (var_history_age_limit::text || '' days '')::interval; RAISE NOTICE ''set time = %'',set_time; delete from history where complete_time <= set_time; return var_history_age_limit; END;' LANGUAGE 'plpgsql'; -- Richard Huxton
"Sugandha Shah" <Sugandhas@cybage.com> writes:
> CREATE FUNCTION del_old_history() RETURNS bool AS '
> declare
> var_history_age_limit int4;
> set_time datetime;
> BEGIN
> select into var_history_age_limit history_age_limit from database_info;
> IF (var_history_age_limit is not null) THEN
> set_time := select current_date()+ INTERVAL ' ' $var_history_age_limit day' ';
You don't use a $ to refer to plpgsql variables (except for parameters,
and there the *name* of the parameter is actually $n). Also ":= select"
is redundant; I believe the correct syntax would be
set_time := current_date() + ...
or at least it would be if SQL expected current_date to come with
parentheses, but it doesn't, so the next bug is that you need
set_time := current_date + ...
Another problem is that "INTERVAL ''var_history_age_limit day''" isn't
going to work because plpgsql doesn't do textual interpolation of
variables into queries. (If you want a language where that's how it's
done, try pltcl or plperl.) While you could hack around with something
like "CAST(text(var_history_age_limit) || ' day' as interval)", this
actually is very much the hard way to do it --- adding an integer to a
date already does what you want. So this statement should just be
set_time := current_date + var_history_age_limit;
although given the logic used later I wonder whether what you are after
isn't really
set_time := current_date - var_history_age_limit;
BTW I'd declare set_time as timestamp or timestamptz if I were you;
datetime is an obsolete datatype name that's not going to be accepted
anymore as of 7.3.
regards, tom lane
Hello Richard, I'm really thankful to you. It worked. Somehow I wasn't getting it to work. This line did the trick. set_time := current_date() - (var_history_age_limit::text || '' days '')::interval; Regards, -Sugandha ----- Original Message ----- From: "Richard Huxton" <dev@archonet.com> To: "Sugandha Shah" <Sugandhas@cybage.com>; "Janning Vygen" <vygen@gmx.de> Cc: <pgsql-sql@postgresql.org> Sent: Wednesday, August 14, 2002 7:04 PM Subject: Re: [SQL] Few Queries On Wednesday 14 Aug 2002 1:29 pm, Sugandha Shah wrote: > Hi , > > No luck . Even with Select Into . Please if any body has faced similar > problem and knows a solution. You don't need select into here - the sample below deletes everything older than one day. You should be able to adapt it to your needs. Your example had a + rather than a - which would delete things in the future, that might have been what you intended, or it might not. The RAISE NOTICE line prints a useful debug value. I like to scatter these around while I'm testing. CREATE FUNCTION del_old_history() RETURNS int4 AS ' DECLARE var_history_age_limit int4; set_time timestamp; BEGIN var_history_age_limit:=1; set_time := current_date() - (var_history_age_limit::text || '' days '')::interval; RAISE NOTICE ''set time = %'',set_time; delete from history where complete_time <= set_time; return var_history_age_limit; END;' LANGUAGE 'plpgsql'; -- Richard Huxton ---------------------------(end of broadcast)--------------------------- TIP 6: Have you searched our list archives? http://archives.postgresql.org