Re: Calling plSQL functions

From: Josh Berkus <josh(at)agliodbs(dot)com>
To: Lonnie Cumberland <lonnie_cumberland(at)yahoo(dot)com>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, pgsql-sql(at)postgresql(dot)org
Subject: Re: Calling plSQL functions
Date: 2001-04-13 20:45:49
Message-ID: 3AD7657D.87AFA73D@agliodbs.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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
WHERE order_usq = v_order AND detail_req = FALSE
ORDER BY detail_id
LIMIT 1 OFFSET insert_loop;

insert_loop := insert_loop + 1;

UPDATE matches SET match_score = match_score +
(20::NUMERIC/CAST(count_details AS
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 information technology josh(at)agliodbs(dot)com
and data management solutions (415) 565-7293
for law firms, small businesses fax 621-2533
and non-profit organizations. San Francisco

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Lonnie Cumberland 2001-04-13 21:07:15 Re: Calling plSQL functions
Previous Message Tom Lane 2001-04-13 19:02:53 Re: Calling plSQL functions