Re: Calling plSQL functions - Mailing list pgsql-sql

From Josh Berkus
Subject Re: Calling plSQL functions
Date
Msg-id 3AD7657D.87AFA73D@agliodbs.com
Whole thread Raw
In response to Re: Calling plSQL functions  (Lonnie Cumberland <lonnie_cumberland@yahoo.com>)
Responses Re: Calling plSQL functions
List pgsql-sql
Lonnie, Tom:

Here's a somewhat complicated example of what Tom's talking about from
my own programs.  

HOWEVER, you should use this kind of structure sparingly, if at all. 
SQL is a declarative language, rather than a procedural one.  For
updates to groups of records, you should put the updates in sets and use
declarative statements whenever possible, rather than a looping
structure.

If you find you *have* to do a lot of looping rather than taking a
declarative approach, you might want to consider changing languages. 
PL/perl, PL/TCL and C are all much better equipped to handle loops and
arrays than PL/pgSQL and SQL.

The example, part of a 279-line function which calculates a weighted job
score evaluation for an HR database:

--Calculate DETAILS modifier
--loop through details one at a time, adding to candidates 
--that have that detail
       count_odetails := count_details - COALESCE(count_rdetails, 0);
       IF count_odetails > 0 THEN               insert_loop := 0;               WHILE insert_loop < count_odetails
LOOP
                       SELECT detail_id INTO detail_no                       FROM order_details
WHEREorder_usq = v_order AND detail_req = FALSE                       ORDER BY detail_id                       LIMIT 1
OFFSETinsert_loop;
 
                       insert_loop := insert_loop + 1;
                       UPDATE matches SET match_score = match_score +
(20::NUMERIC/CAST(count_detailsAS
 
NUMERIC))                       FROM candidate_details                       WHERE candidate_details.candidate_usq =
matches.candidate_usq                               AND match_sq = match_id                               AND detail_id
=detail_no;
 
               END LOOP;       END IF;

(NOTE:  OFFSET will not accept any math if set dynamically {as above}. 
Thus, "LIMIT 1 OFFSET insert_loop + 1" will error).

-Josh

-- 
______AGLIO DATABASE SOLUTIONS___________________________                                       Josh Berkus  Complete
informationtechnology      josh@agliodbs.com   and data management solutions       (415) 565-7293  for law firms, small
businesses      fax  621-2533   and non-profit organizations.       San Francisco
 


pgsql-sql by date:

Previous
From: Tom Lane
Date:
Subject: Re: Calling plSQL functions
Next
From: Lonnie Cumberland
Date:
Subject: Re: Calling plSQL functions