On 2010-03-27, Kent Scott <kscott@logicalsi.com> wrote:
> I am having a hard time coming from MS SQL in terms of creating
> functions. Minor things keep you from being able to create functions
> that are not an issue in MS SQL so I need help in understanding why they
> are an issue so that I can ultimately create the functions that I need
> to. I can create and run the following function fine :
>
> CREATE FUNCTION listSales(dt date,movie text) RETURNS SETOF ticket AS
> $$
> BEGIN
> select * from ticket where date = $1 and mov_num = $2;
> END;
> $$
> LANGUAGE SQL;
doesn't work for me, I get a syntax error at select.
If I remove BEGIN and END; it works.
> however, the following will not create :
> CREATE FUNCTION listSales(dt date,movie text) RETURNS SETOF ticket AS
> $$
> declare
> r1 int;
> BEGIN
> select * from ticket where date = $1 and mov_num = $2;
> END;
> $$
> LANGUAGE SQL;
>
> I get a syntax error on r1 int and I have no idea why. Am I not allowed
> to declare variables if they are not used?
PLPGSQL id a different language to SQL.
DECLARE, BEGIN, and END; ( used in this way) are PLPGSQL not SQL.
SELECT is not the way to return values from a PLPGSQL function.
The following is roughly equivalent to the corrected version of your SQL
function above.
CREATE OR REPLACE FUNCTION listSales(dt date,movie text) RETURNS SETOF ticket AS
$$
declare
r1 integer;
t ticket;
BEGIN
for t IN select * from ticket where date = $1 and mov_num = $2
loop
return next t;
end loop;
return;
END;
$$
LANGUAGE PLPGSQL;