The example does not make a lot of sense; it has been created for
demonstration purposes only:
-------------------------------------------------------------
-- One Table:
-- Table: public.denorm

-- DROP TABLE public.denorm;

CREATE TABLE public.denorm
(
  thekey int8 NOT NULL DEFAULT nextval('public."denorm_theKey_seq"'::text),
  cat1 int8 NOT NULL,
  cat2 int8 NOT NULL,
  cat3 int8 NOT NULL,
  thedata varchar(128),
  CONSTRAINT pk_denorm PRIMARY KEY (thekey)
) WITHOUT OIDS;
GRANT ALL ON TABLE public.denorm TO god WITH GRANT OPTION;
GRANT ALL ON TABLE public.denorm TO public;
----------------------------------------------------------

----------------------------------------------------------
-- fill it:
insert into denorm (theKey, cat1, cat2, cat3, theData) values
(1,10,11,0,'one');
insert into denorm (theKey, cat1, cat2, cat3, theData) values
(10,100,101,102,'10');
insert into denorm (theKey, cat1, cat2, cat3, theData) values
(11,110,111,112,'11');

insert into denorm (theKey, cat1, cat2, cat3, theData) values
(100,0,0,0,'100');
insert into denorm (theKey, cat1, cat2, cat3, theData) values
(101,0,0,0,'101');
insert into denorm (theKey, cat1, cat2, cat3, theData) values
(102,0,0,0,'102');
insert into denorm (theKey, cat1, cat2, cat3, theData) values
(103,0,0,0,'103');
insert into denorm (theKey, cat1, cat2, cat3, theData) values
(110,0,0,0,'110');
insert into denorm (theKey, cat1, cat2, cat3, theData) values
(111,0,0,0,'111');
insert into denorm (theKey, cat1, cat2, cat3, theData) values
(112,0,0,0,'112');
----------------------------------------------------------

-- called function:
create or replace function norm(int8,record) returns int8 as '
declare
prim alias for $1;
catrec alias for $2;
currrec record;
begin
        raise warning \'Key=%; data=[%];\',catrec.cat1,catrec.theData;
        if(catrec.cat1>0) then
                select * into currec from denorm where theKey=catrec.cat1;
                select norm(catrec.cat1,currec) into dmy;
         else
                return(0);
        end if;

        if(catrec.cat2>0) then
                select * into currec from denorm where theKey=catrec.cat2;
                select norm(catrec.cat2,currec) into dmy;
         else
                return(1);
        end if;

        if(catrec.cat3>0) then
                select * into currec from denorm where theKey=catrec.cat3;
                select norm(catrec.cat1,currec) into dmy;
         else
                return(2);
        end if;
        return 3;
end
' language 'plpgsql'
-----------------------------------------------------------------
-- calling function
create or replace function doTree() returns int8 as '
declare
currec record;
catrec record;
dmy int8;
rdct int8;
begin
        rdct:=0;
        for catrec in select * from denorm loop
                rdct:=rdct+1;
                raise warning \'Start Key=%;
data=[%];\',catrec.cat1,catrec.theData;
                loop
                        if(catrec.cat1>0) then
                                select * into currec from denorm where
theKey=catrec.cat1;
                                raise warning \'before call:%;\',
currec.cat1;
                                select norm(catrec.cat1,currec) into dmy;
                                raise warning \'after call:%;\',
currec.cat1;
                         else
                                exit;
                        end if;

                        if(catrec.cat2>0) then
                                select * into currec from denorm where
theKey=catrec.cat2;
                                select norm(catrec.cat2,currec) into dmy;
                        else
                                exit;
                        end if;

                        if(catrec.cat3>0) then
                                select * into currec from denorm where
theKey=catrec.cat3;
                                select norm(catrec.cat1,currec) into dmy;
                        end if;
                        exit;
                end loop;
        end loop;
        return rdct;
end;
' language 'plpgsql'
----------------------------------------------------------

--CALLING:
select doTree();

RESULT:
WARNING:  Start Key=10; data=[one];
WARNING:  before call:100;

ERROR:  column "currec" does not exist
CONTEXT:  PL/pgSQL function "dotree" line 15 at select into variables

==============================================================

I call a function with one data element and a record; I receive the error
message that the record is a column which is a fraud since the system shows:
CREATE OR REPLACE FUNCTION public.norm(int8, record)
  RETURNS int8 AS ...

When I try to use denorm%ROWTYPE% I get already a syntax error in the
declaration of the function:
create or replace function norm(int8,denorm%ROWTYPE%) returns int8 as ' :

ERROR:  syntax error at or near "%" at character 44

Where am I going wrong; what has to change to hand over a record to a called
function??

with kind regards

 günter strubinsky
 <[EMAIL PROTECTED]>
 Tel: 402.212.0196
 



---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to