Thread: Function problem

Function problem

From
"Patrick Hatcher"
Date:
Howdy all,

I have a function that worked as regular SQL before I tried to make it a
function.  I suspect it has something to do with the literal strings I'm
looking at, but I can't figure it out.  every time I run the function, I
get an error message on the word TEMP.  I've tried removing the word temp
but then the error jumps to crossYTD.   I've tried making the literals
single quotes, but that doesn't seem to work.  Any suggestions?  TIA.

Create Function sp_ddw_crosstab() RETURNS int4 AS '

BEGIN

     /* Create the cross tab of YTD data */
     Select Item_UPC, Cat_Desc,Pat_Desc,
     Sum( Case Appl_ID When "NET" Then RESERVEDUNITS1 Else 0 End) as
Loc128_Demand,
     Sum( Case Appl_ID When "NET" Then RESERVEDDOLLARS Else 0 End) as
Loc128_DemandDollar
     into  TEMP crossytd
     From salesYTD q
     Group by Item_UPC,Cat_Desc,Pat_Desc;
     return 1;

END;
'LANGUAGE 'plpgsql';


Patrick Hatcher
Macys.Com
Legacy Integration Developer
415-932-0610 office
HatcherPT - AIM




Re: Function problem

From
"Patrick Hatcher"
Date:
This a snippet of a much longer procedure.  I am creating a cross-tab of
sales data and dumping it into a temp table.  A bunch of other temp tables
are created and then the whole thing is put together in 1 table for
reporting purposes.  As stated earlier, it works if I don't put it into a
function and I think it has to do with my quotes (").

Patrick Hatcher
Macys.Com
Legacy Integration Developer
415-932-0610 office
HatcherPT - AIM





                    "Josh Berkus"
                    <agliodbs@openo       To:     "Patrick Hatcher" <PHatcher@macys.com>,
                    ffice.org>             pgsql-novice@postgresql.org
                                          cc:
                    03/15/2002            Subject:     Re: [NOVICE] Function problem
                    06:00 PM






Patrick,

Frankly, your syntax is wierd enough that I can't figure out what
 you're trying to do. Can you explain?

> Create Function sp_ddw_crosstab() RETURNS int4 AS '
>
> BEGIN
>
>      /* Create the cross tab of YTD data */
>      Select Item_UPC, Cat_Desc,Pat_Desc,
>      Sum( Case Appl_ID When "NET" Then RESERVEDUNITS1 Else 0 End) as
> Loc128_Demand,
>      Sum( Case Appl_ID When "NET" Then RESERVEDDOLLARS Else 0 End) as
> Loc128_DemandDollar
>      into  TEMP crossytd
>      From salesYTD q
>      Group by Item_UPC,Cat_Desc,Pat_Desc;
>      return 1;
>
> END;
> 'LANGUAGE 'plpgsql';

-Josh





Re: Function problem

From
"Josh Berkus"
Date:
Partrick,

> This a snippet of a much longer procedure.  I am creating a cross-tab
>  of
> sales data and dumping it into a temp table.  A bunch of other temp
>  tables
> are created and then the whole thing is put together in 1 table for
> reporting purposes.  As stated earlier, it works if I don't put it
>  into a
> function and I think it has to do with my quotes (").

No, the problem is that SELECT INTO in a procedure is for selecting
 data into variables.  PL/pgSQL is expecting a variable named "TEMP"
 and not finding one.  Instead, how about using the more standard
 CREATE TABLE AS SELECT ... ?

-Josh Berkus

Re: Function problem

From
"Patrick Hatcher"
Date:
Ahhhhhhhh.  Thank you Josh.  I just learned something new.  I've been doing
it this way in MS SQL for years.

Patrick Hatcher
Macys.Com





                    "Josh Berkus"
                    <josh@agliodbs       To:     "Patrick Hatcher" <PHatcher@macys.com>
                    .com>                cc:     pgsql-novice@postgresql.org
                                         Subject:     Re: [NOVICE] Function problem
                    03/15/2002
                    06:49 PM






Partrick,

> This a snippet of a much longer procedure.  I am creating a cross-tab
>  of
> sales data and dumping it into a temp table.  A bunch of other temp
>  tables
> are created and then the whole thing is put together in 1 table for
> reporting purposes.  As stated earlier, it works if I don't put it
>  into a
> function and I think it has to do with my quotes (").

No, the problem is that SELECT INTO in a procedure is for selecting
 data into variables.  PL/pgSQL is expecting a variable named "TEMP"
 and not finding one.  Instead, how about using the more standard
 CREATE TABLE AS SELECT ... ?

-Josh Berkus





Re: Function problem

From
"Josh Berkus"
Date:
Partick,

> Ahhhhhhhh.  Thank you Josh.  I just learned something new.  I've been
>  doing
> it this way in MS SQL for years.

Different Procedural SQL implementation, different syntax.

Transact-SQL:
variable assignment:
SELECT @fig=col1, @mike=col2
FROM table1 WHERE col3 = 'a'
temp table creation:
SELECT col1, col2 INTO temp_1
FROM table1 WHRE col3 = 'a'

PL/pgSQL:
variable assignment:
SELECT col1, col2 INTO v_fig, v_mike
FROM table1 WHERE col3='a';
temp table creation
CREATE TEMPORARY TABLE temp_1 AS
SELECT col1, col2 FROM table1
WHERE col3='a';

BTW, in either language you want to minimize your creation of temporary
 tables in procedures -- they are much slower than variables or even
 very complex queries.

-Josh Berkus