Обсуждение: reuse RECORD in function 'select into'?
In the function below I do four "select into" actions to check if
particular values already exist in any one of several tables.
Can I reuse the RECORD for each 'select into'? The RECORDs are
presumably empty after each select into, as the function needs FOUND to
be false to continue.
Also, should I "RETURN 0" after a RAISE EXCEPTION?
Thanks
Rory
CREATE OR REPLACE FUNCTION
fn_c1_create_board ( integer, integer, varchar, varchar, varchar) RETURNS INTEGER
AS '
DECLARE
creator ALIAS for $1;
typer ALIAS for $2;
name ALIAS for $3;
email ALIAS for $4;
description ALIAS for $5;
recone RECORD;
rectwo RECORD;
recthree RECORD;
recfour RECORD;
BEGIN
-- more extensive checking to be done in client program
IF creator IS NULL
THEN
RAISE EXCEPTION ''no creator found at fn_c1_create_board'';
END IF;
IF typer IS NULL
THEN
RAISE EXCEPTION ''no typer found at fn_c1_create_board'';
END IF;
IF name IS NULL
THEN
RAISE EXCEPTION ''no name found at fn_c1_create_board'';
END IF;
IF email IS NULL
THEN
RAISE EXCEPTION ''no email found at fn_c1_create_board'';
END IF;
IF description IS NULL
THEN
RAISE EXCEPTION ''no description found at fn_c1_create_board'';
END IF;
-- find all in people and boards who have a name like this one.
-- if found, abort creation
SELECT into recone
n_id
FROM
boards
WHERE
t_name ~* name;
IF FOUND
THEN
RAISE EXCEPTION ''board with same name found at fn_c1_create_board'';
END IF;
SELECT into rectwo
n_id
FROM
people
WHERE
t_nickname ~* name;
IF FOUND
THEN
RAISE EXCEPTION ''person with same nickname found at fn_c1_create_board'';
END IF;
SELECT into recthree
n_id
FROM
people
WHERE
t_email ~* email;
IF FOUND
THEN
RAISE EXCEPTION ''person with same email found at fn_c1_create_board'';
END IF;
SELECT into recfour
n_id
FROM
boards
WHERE
t_email ~* email;
IF FOUND
THEN
RAISE EXCEPTION ''board with same email found at fn_c1_create_board'';
END IF;
-- ok, if we have got here, its ok to make the board!
INSERT INTO
boards
(n_creator, n_type, t_name, t_email, t_description)
VALUES
(creator, typer, name, email, description);
RETURN 1;
END;'
LANGUAGE plpgsql;
--
Rory Campbell-Lange
<rory@campbell-lange.net>
<www.campbell-lange.net>
Rory, > In the function below I do four "select into" actions to check if > particular values already exist in any one of several tables. > > Can I reuse the RECORD for each 'select into'? The RECORDs are > presumably empty after each select into, as the function needs FOUND to > be false to continue. You certainly can, technically. In fact, you don't even need the RECORD to be empty. But you want to be *real* careful doing this. Re-using variables for different purposes (in procedural languages), in general, is a very bad idea unless you are desperately shourt of memory. It's far too easy to lose track of a re-used variable and waste hours debugging. O'Reilly's "PL/SQL Programming" has an excellent chapter on good programming practives for SQL-procedural languages that I would love to razor out and distribute as a pamphlet. It would be worth a gander the next time you have a long lunch in your local tech book store. > Also, should I "RETURN 0" after a RAISE EXCEPTION? Yes, to make the parser happy. -- Josh Berkus Aglio Database Solutions San Francisco
Thanks again for your help, Josh. On 27/05/03, Josh Berkus (josh@agliodbs.com) wrote: > > In the function below I do four "select into" actions to check if > > particular values already exist in any one of several tables. > > > > Can I reuse the RECORD for each 'select into'? The RECORDs are > > presumably empty after each select into, as the function needs FOUND to > > be false to continue. > > You certainly can, technically. In fact, you don't even need the RECORD to be > empty. That makes sense, although my "Postgresql Essential Reference" book selects into an "EmpRec" record. FOUND eq true if one (or more) rows returned, I see. > But you want to be *real* careful doing this. Re-using variables for > different purposes (in procedural languages), in general, is a very bad idea > unless you are desperately shourt of memory. It's far too easy to lose > track of a re-used variable and waste hours debugging. > > O'Reilly's "PL/SQL Programming" has an excellent chapter on good programming > practives for SQL-procedural languages that I would love to razor out and > distribute as a pamphlet. It would be worth a gander the next time you have > a long lunch in your local tech book store. Is this the Oracle PL/SQL book? -- Rory Campbell-Lange <rory@campbell-lange.net> <www.campbell-lange.net>