Cursor based records in PostgreSQL

前端 未结 2 1517
孤独总比滥情好
孤独总比滥情好 2020-12-06 00:51

I\'m trying to use cursors for a query that joins multiple tables. I\'ve seen that for oracle there is a cursor based record. When I try the same for Postgres, it throws som

相关标签:
2条回答
  • 2020-12-06 01:45

    Just use the RECORD type:

    DECLARE
        ...
        cur_row RECORD;
    BEGIN
        ...
        FETCH xyz INTO cur_row;
        EXIT WHEN NOT FOUND;
        IF cur_row.city LIKE 'CH%' THEN
            ...
    
    0 讨论(0)
  • 2020-12-06 01:55

    1. Implicit cursor

    It's almost always better to use the implicit cursor of a FOR loop than to resort to a somewhat slower and unwieldy explicit cursor. I have written thousands of plpgsql functions and only a hand full of times explicit cursors made any sense.

    CREATE OR REPLACE FUNCTION avoidable_states()
      RETURNS SETOF varchar AS
    $func$
    DECLARE
        rec record;
    BEGIN   
       FOR rec IN
          SELECT *
          FROM   address ad
          JOIN   city    ct USING (city_id)
       LOOP
          IF rec.city LIKE '%hi%' THEN
              RETURN NEXT rec.city;               
          END IF;
       END LOOP;
    END
    $func$  LANGUAGE plpgsql STABLE;
    

    Aside: there is nothing in the function that would need volatility VOLATILE. Use STABLE.

    2. Set-based approach

    It's almost always better to use a set-based approach if possible. Use RETURN QUERY to return as set from a query directly.

    CREATE OR REPLACE FUNCTION avoidable_states()
      RETURNS SETOF varchar AS
    $func$
    BEGIN   
       RETURN QUERY
       SELECT ct.city
       FROM   address ad
       JOIN   city    ct USING (city_id)
       WHERE  ct.city LIKE '%hi%';
    END
    $func$  LANGUAGE plpgsql STABLE;
    

    3. SQL function

    For the simple case (probably a simplification), you might also use a simple SQL function or even just the query:

    CREATE OR REPLACE FUNCTION avoidable_states()
      RETURNS SETOF varchar AS
    $func$
       SELECT ct.city
       FROM   address ad
       JOIN   city    ct USING (city_id)
       WHERE  ct.city LIKE '%hi%';
    $func$  LANGUAGE sql STABLE;
    
    0 讨论(0)
提交回复
热议问题