Re: Calling plSQL functions
От | Josh Berkus |
---|---|
Тема | Re: Calling plSQL functions |
Дата | |
Msg-id | 3AD7657D.87AFA73D@agliodbs.com обсуждение исходный текст |
Ответ на | Re: Calling plSQL functions (Lonnie Cumberland <lonnie_cumberland@yahoo.com>) |
Ответы |
Re: Calling plSQL functions
|
Список | 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 по дате отправления: