Как создать функцию для обновления столбцов в Postgres? - PullRequest
0 голосов
/ 10 марта 2020

Я надеюсь создать функцию, которая может обновлять столбцы в моей таблице.

Но, похоже, это не сработает. Я довольно новичок в postgres, и мне интересно, есть ли способ сделать это? Вот то, что у меня есть до сих пор:

Create Table roads(
    intid_ integer,
    muni text,
    alias_ text,
    roadnames text,
    geom geometry);

Insert into roads (roadnames, geom, intid_, alias_)
SELECT 
    trim(student.sc_e911slrn.prefix) || trim(student.sc_e911slrn.name) || trim(student.sc_e911slrn.suffix), 
    geom, objectid, alias
FROM student.sc_e911slrn;

--------------------------------------------------------------------

CREATE type student.inter AS (
     roadnames text,
        intid_ int,
        alias_ text,
        muni text,
        ST_Intersection geometry,
        geom geometry);

--< Cursor >--------------------------------------------------------
Create function create_intersections()
    /*returns table student.intersect_roads As $method1$*/
    RETURNS table (
        roadnames text,
        intid_ int,
        alias_ text,
        muni text,
        ST_Intersection geometry,
        geom geometry) As $$

Declare
    return_intersect inter;
    rec_road Record;
    cur_road Cursor()
        For Select intid_, geom, roadnames
        From student.roads;

Begin
    Open cur_road();

    Loop
        fetch cur_road into rec_road;
        exit when not found;

        If ST_Touches(rec_road.geom, student.roads.geom) AND
            rec_road.geom != student.roads.geom AND 
            rec_road.intid_ != student.roads.intid_

        Then Update student.intersect_road
             Set st_intersection = ST_Intersection (rec_road.geom, student.roads.geom),
                 intid_ = rec_road.intid_,
                 intersections = rec_road.roadnames|| ' & ' || student.raods.roadnames,
                 alias_ = rec_road.alias_,
                 /*muni = */
                 polyline = ST_Union(rec_road.geom, student.roads.geom)
                 RETURNING * into return_intersect;
                 RETURN NEXT;
        End if;
    End Loop;
    Close cur_road;

    RETURN;

End; 
$$ Language plpgsql;

Итак, путь к таблице выглядит примерно так:

Intid_     Muni    Alias_           Roadnames            geom
24581722   NULL    CR 52       Coopers Falls road        ...
24581723   NULL    CR 44       Rama road                 ...

Я пытаюсь создать таблицу, содержащую пересечения в местоположении где каждая дорога пересекает Roadname 1 & Roadname 2, а также геометрические пространственные данные для пересечения ST_Intersection(a.geom, b.geom)

Я также пытался

CREATE FUNCTION create_intersections() 
     UPDATE student.intersect_roads AS $$
Declare
Begin
End
$$

, который также не работает. Любые отзывы будут оценены. Спасибо!

1 Ответ

0 голосов
/ 10 марта 2020

Вы не предоставили DDL, а не образцы данных, поэтому ничего из следующего не проверено. Но просто указание на то, что вы хотите вернуть строки, недостаточно. Вы должны указать, какие строки либо возвращать запрос, либо возвращать следующий.

Create Function create_intersections()
    returns table student.student.intersect_roads As $method1$

    return_intersect student.student.intersect_roads;   -- <<<< 
    rec_road Record;
    cur_road Cursor(roadname text);
        For Select intid, geom, roadname
        From student.roads
        Where student.raods.roadname != roadname

Begin
    Open cur_road (roadname);


    Loop
        fetch cur_road into rec_road
        exit when not found;

        If ST_Touches(rec_road.geom, student.roads.geom) AND
            rec_road.geom != student.roads.geom AND 
            rec_road.intid != student.roads.intid 

        Then Update student.intersect_roads
             Set st_intersection = ST_Intersection (rec_road.geom, student.roads.geom),
                 intid = rec_road.intid,
                 intersections = rec_road.roadname|| ' & ' || student.raods.roadname,
                 alias = rec_road.alias,
                 /*muni = */
                 polyline = ST_Union(rec_road.geom, student.roads.geom)
                 returning * into return_intersect ;  --<<<<

                 return next return_intersect ;  --<<<<
        End if;
    End Loop;
    Close cur_road;
    RETURN;                --<<<<
    End; $method1$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...