| 203 | {{{ |
| 204 | -- it is necessary to create a type to hold the output type |
| 205 | DROP TYPE IF EXISTS wso1_id; |
| 206 | CREATE TYPE wso1_id as (wso1_id int); |
| 207 | -- In the function I tried to create a wso type to simplify the text. Pb you need to specify |
| 208 | -- a tablename.columname%TYPE which will have to change along with the column, hence the big ugly script below... |
| 209 | DROP FUNCTION IF EXISTS ccm21.pricatch_from_catch(gid_ numeric); |
| 210 | CREATE OR REPLACE FUNCTION ccm21.pricatch_from_catch(gid_ numeric) RETURNS setof int AS $$ |
| 211 | DECLARE |
| 212 | result RECORD; |
| 213 | pri wso1_id%rowtype; |
| 214 | resultcount RECORD; |
| 215 | BEGIN |
| 216 | SELECT INTO result strahler FROM ccm21.riversegments where gid=gid_; |
| 217 | RAISE NOTICE 'result is %' ,result; |
| 218 | IF result.strahler=2 THEN |
| 219 | RAISE NOTICE 'WSO_2 used'; |
| 220 | SELECT INTO resultcount count(*) from ccm21.catchments c where wso2_id = |
| 221 | (select wso2_id from ccm21.riversegments r |
| 222 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 223 | where r.gid=gid_); |
| 224 | RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; |
| 225 | for pri in select wso1_id from ccm21.catchments c where wso2_id = |
| 226 | (select wso2_id from ccm21.riversegments r |
| 227 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 228 | where r.gid=gid_) loop |
| 229 | pri.wso1_id=CAST(pri.wso1_id AS int8); |
| 230 | return next pri.wso1_id; |
| 231 | end loop; |
| 232 | return; |
| 233 | ELSIF result.strahler=3 THEN |
| 234 | RAISE NOTICE 'WSO_3 used'; |
| 235 | SELECT INTO resultcount count(*) from ccm21.catchments c where wso3_id = |
| 236 | (select wso3_id from ccm21.riversegments r |
| 237 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 238 | where r.gid=gid_); |
| 239 | RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; |
| 240 | for pri in select wso1_id from ccm21.catchments c where wso3_id = |
| 241 | (select wso3_id from ccm21.riversegments r |
| 242 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 243 | where r.gid=gid_) loop |
| 244 | pri.wso1_id=CAST(pri.wso1_id AS int8); |
| 245 | return next pri.wso1_id; |
| 246 | end loop; |
| 247 | return; |
| 248 | ELSIF result.strahler=4 THEN |
| 249 | RAISE NOTICE 'WSO_4 used'; |
| 250 | SELECT INTO resultcount count(*) from ccm21.catchments c where wso4_id = |
| 251 | (select wso4_id from ccm21.riversegments r |
| 252 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 253 | where r.gid=gid_); |
| 254 | RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; |
| 255 | for pri in select wso1_id from ccm21.catchments c where wso4_id = |
| 256 | (select wso4_id from ccm21.riversegments r |
| 257 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 258 | where r.gid=gid_) loop |
| 259 | pri.wso1_id=CAST(pri.wso1_id AS int8); |
| 260 | return next pri.wso1_id; |
| 261 | end loop; |
| 262 | return; |
| 263 | ELSIF result.strahler=5 THEN |
| 264 | RAISE NOTICE 'WSO_5 used'; |
| 265 | SELECT INTO resultcount count(*) from ccm21.catchments c where wso5_id = |
| 266 | (select wso5_id from ccm21.riversegments r |
| 267 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 268 | where r.gid=gid_); |
| 269 | RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; |
| 270 | for pri in select wso1_id from ccm21.catchments c where wso5_id = |
| 271 | (select wso5_id from ccm21.riversegments r |
| 272 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 273 | where r.gid=gid_) loop |
| 274 | pri.wso1_id=CAST(pri.wso1_id AS int8); |
| 275 | return next pri.wso1_id; |
| 276 | end loop; |
| 277 | return; |
| 278 | ELSIF result.strahler=6 THEN |
| 279 | RAISE NOTICE 'WSO_6 used'; |
| 280 | SELECT INTO resultcount count(*) from ccm21.catchments c where wso6_id = |
| 281 | (select wso6_id from ccm21.riversegments r |
| 282 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 283 | where r.gid=gid_); |
| 284 | RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; |
| 285 | for pri in select wso1_id from ccm21.catchments c where wso6_id = |
| 286 | (select wso6_id from ccm21.riversegments r |
| 287 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 288 | where r.gid=gid_) loop |
| 289 | pri.wso1_id=CAST(pri.wso1_id AS int8); |
| 290 | return next pri.wso1_id; |
| 291 | end loop; |
| 292 | return; |
| 293 | ELSIF result.strahler=7 THEN |
| 294 | RAISE NOTICE 'WSO_7 used'; |
| 295 | SELECT INTO resultcount count(*) from ccm21.catchments c where wso7_id = |
| 296 | (select wso7_id from ccm21.riversegments r |
| 297 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 298 | where r.gid=gid_); |
| 299 | RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; |
| 300 | for pri in select wso1_id from ccm21.catchments c where wso7_id = |
| 301 | (select wso7_id from ccm21.riversegments r |
| 302 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 303 | where r.gid=gid_) loop |
| 304 | pri.wso1_id=CAST(pri.wso1_id AS int8); |
| 305 | return next pri.wso1_id; |
| 306 | end loop; |
| 307 | return; |
| 308 | ELSIF result.strahler=8 THEN |
| 309 | RAISE NOTICE 'WSO_8 used'; |
| 310 | SELECT INTO resultcount count(*) from ccm21.catchments c where wso8_id = |
| 311 | (select wso8_id from ccm21.riversegments r |
| 312 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 313 | where r.gid=gid_); |
| 314 | RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; |
| 315 | for pri in select wso1_id from ccm21.catchments c where wso8_id = |
| 316 | (select wso8_id from ccm21.riversegments r |
| 317 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 318 | where r.gid=gid_) loop |
| 319 | pri.wso1_id=CAST(pri.wso1_id AS int8); |
| 320 | return next pri.wso1_id; |
| 321 | end loop; |
| 322 | return; |
| 323 | ELSIF result.strahler=9 THEN |
| 324 | RAISE NOTICE 'WSO_9 used'; |
| 325 | SELECT INTO resultcount count(*) from ccm21.catchments c where wso9_id = |
| 326 | (select wso9_id from ccm21.riversegments r |
| 327 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 328 | where r.gid=gid_); |
| 329 | RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; |
| 330 | for pri in select wso1_id from ccm21.catchments c where wso9_id = |
| 331 | (select wso9_id from ccm21.riversegments r |
| 332 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 333 | where r.gid=gid_) loop |
| 334 | pri.wso1_id=CAST(pri.wso1_id AS int8); |
| 335 | return next pri.wso1_id; |
| 336 | end loop; |
| 337 | return; |
| 338 | ELSIF result.strahler=10 THEN |
| 339 | RAISE NOTICE 'WSO_10 used'; |
| 340 | SELECT INTO resultcount count(*) from ccm21.catchments c where wso10_id = |
| 341 | (select wso10_id from ccm21.riversegments r |
| 342 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 343 | where r.gid=gid_); |
| 344 | RAISE NOTICE 'number of primary catchments in the catchment =%',resultcount; |
| 345 | for pri in select wso1_id from ccm21.catchments c where wso10_id = |
| 346 | (select wso10_id from ccm21.riversegments r |
| 347 | join ccm21.catchments c on r.wso1_id=c.wso1_id |
| 348 | where r.gid=gid_) loop |
| 349 | pri.wso1_id=CAST(pri.wso1_id AS int8); |
| 350 | return next pri.wso1_id; |
| 351 | end loop; |
| 352 | return; |
| 353 | ELSE RAISE NOTICE 'Strahler is larger than this function can handle !'; |
| 354 | END IF; |
| 355 | RETURN; |
| 356 | END; |
| 357 | $$ |
| 358 | LANGUAGE 'plpgsql' ; |
| 359 | COMMENT ON FUNCTION ccm21.pricatch_from_catch (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'; |
| 360 | }}} |
| 361 | {{{ |
| 362 | --examples for use |
| 363 | |
| 364 | SELECT ccm21.pricatch_from_catch(234706); --la vilaine dans son ensemble |
| 365 | -- NOTICE: result is (6) |
| 366 | -- NOTICE: WSO_6 used |
| 367 | -- NOTICE: number of primary catchments in the catchment =(759) |
| 368 | -- durée=2s |
| 369 | -- |
| 370 | SELECT * from ccm21.catchments where wso1_id in (SELECT ccm21.pricatch_from_catch(234706)); |
| 371 | }}} |
| 372 | |