Version 1 (modified by celine, 15 years ago) (diff) |
---|
back to first page ..
back to CookBook Eda
back to CCM2 download and load
-- it is necessary to create a type to hold the output type DROP TYPE IF EXISTS wso1_id; CREATE TYPE wso1_id as (wso1_id int); -- In the function I tried to create a wso type to simplify the text. Pb you need to specify -- a tablename.columname%TYPE which will have to change along with the column, hence the big ugly script below... DROP FUNCTION IF EXISTS ccm21.mycatchment(gid_ numeric); CREATE OR REPLACE FUNCTION ccm21.mycatchment(gid_ numeric) RETURNS setof int AS $$ DECLARE result RECORD; pri wso1_id%rowtype; resultcount RECORD; BEGIN SELECT INTO result strahler FROM ccm21.riversegments where gid=gid_; RAISE NOTICE 'result is %' ,result; CASE WHEN result.strahler=2 THEN RAISE NOTICE 'WSO_2 used'; SELECT INTO resultcount count(*) from ccm21.catchments c where wso2_id = (select wso2_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_); RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; for pri in select wso1_id from ccm21.catchments c where wso2_id = (select wso2_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_) loop pri.wso1_id=CAST(pri.wso1_id AS int8); return next pri.wso1_id; end loop; return; WHEN result.strahler=3 THEN RAISE NOTICE 'WSO_3 used'; SELECT INTO resultcount count(*) from ccm21.catchments c where wso3_id = (select wso3_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_); RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; for pri in select wso1_id from ccm21.catchments c where wso3_id = (select wso3_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_) loop pri.wso1_id=CAST(pri.wso1_id AS int8); return next pri.wso1_id; end loop; return; WHEN result.strahler=4 THEN RAISE NOTICE 'WSO_4 used'; SELECT INTO resultcount count(*) from ccm21.catchments c where wso4_id = (select wso4_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_); RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; for pri in select wso1_id from ccm21.catchments c where wso4_id = (select wso4_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_) loop pri.wso1_id=CAST(pri.wso1_id AS int8); return next pri.wso1_id; end loop; return; WHEN result.strahler=5 THEN RAISE NOTICE 'WSO_5 used'; SELECT INTO resultcount count(*) from ccm21.catchments c where wso5_id = (select wso5_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_); RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; for pri in select wso1_id from ccm21.catchments c where wso5_id = (select wso5_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_) loop pri.wso1_id=CAST(pri.wso1_id AS int8); return next pri.wso1_id; end loop; return; WHEN result.strahler=6 THEN RAISE NOTICE 'WSO_6 used'; SELECT INTO resultcount count(*) from ccm21.catchments c where wso6_id = (select wso6_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_); RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; for pri in select wso1_id from ccm21.catchments c where wso6_id = (select wso6_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_) loop pri.wso1_id=CAST(pri.wso1_id AS int8); return next pri.wso1_id; end loop; return; WHEN result.strahler=7 THEN RAISE NOTICE 'WSO_7 used'; SELECT INTO resultcount count(*) from ccm21.catchments c where wso7_id = (select wso7_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_); RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; for pri in select wso1_id from ccm21.catchments c where wso7_id = (select wso7_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_) loop pri.wso1_id=CAST(pri.wso1_id AS int8); return next pri.wso1_id; end loop; return; WHEN result.strahler=8 THEN RAISE NOTICE 'WSO_8 used'; SELECT INTO resultcount count(*) from ccm21.catchments c where wso8_id = (select wso8_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_); RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; for pri in select wso1_id from ccm21.catchments c where wso8_id = (select wso8_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_) loop pri.wso1_id=CAST(pri.wso1_id AS int8); return next pri.wso1_id; end loop; return; WHEN result.strahler=9 THEN RAISE NOTICE 'WSO_9 used'; SELECT INTO resultcount count(*) from ccm21.catchments c where wso9_id = (select wso9_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_); RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; for pri in select wso1_id from ccm21.catchments c where wso9_id = (select wso9_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_) loop pri.wso1_id=CAST(pri.wso1_id AS int8); return next pri.wso1_id; end loop; return; WHEN result.strahler=10 THEN RAISE NOTICE 'WSO_10 used'; SELECT INTO resultcount count(*) from ccm21.catchments c where wso10_id = (select wso10_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_); RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; for pri in select wso1_id from ccm21.catchments c where wso10_id = (select wso10_id from ccm21.riversegments r join ccm21.catchments c on r.wso1_id=c.wso1_id where r.gid=gid_) loop pri.wso1_id=CAST(pri.wso1_id AS int8); return next pri.wso1_id; end loop; return; ELSE RAISE NOTICE 'Strahler is larger than this function can handle !'; END CASE; RETURN; END; $$ LANGUAGE 'plpgsql' ; COMMENT ON FUNCTION ccm21.mycatchment (gid_ numeric) IS 'Uses the gid from ccm21.riversegments, checks strahler, and select the catchment accordingly, then returns all primary catchments from this larger catchment';