Обсуждение: Instaltiating an ARRAY within a function
=========================================== CREATE OR REPLACE FUNCTION arr( inout x varchar[] ) AS $Z$ DECLARE i integer; BEGIN select ARRAY['Danny','Eissam','Moshe'] into x; end; $Z$ LANGUAGE 'plpgsql' VOLATILE; =========================================== CREATE OR REPLACE FUNCTION callarr() returns integer AS $Z$ DECLARE x varchar[6]; BEGIN perform arr(x); RAISE NOTICE 'x[1]=%',x[1]; return 0; end; $Z$ LANGUAGE 'plpgsql' VOLATILE; =========================================== select callarr(); NOTICE: x[1]=<NULL> ??? Should have been DANNY Should it work? Thanks Danny
Hello problem is elsewhere. PostgreSQL doesn't support by ref variables. In your sample you have to do: CREATE OR REPLACE FUNCTION callarr() returns integer AS $Z$ DECLARE x varchar[6]; BEGIN x := arr(x); <-------!!!!!!!!! RAISE NOTICE 'x[1]=%',x[1]; return 0; end; $Z$ LANGUAGE 'plpgsql' VOLATILE; Pavel On 12/12/2007, Abraham, Danny <danny_abraham@bmc.com> wrote: > =========================================== > > CREATE OR REPLACE FUNCTION arr( inout x varchar[] ) > AS > $Z$ > DECLARE > i integer; > BEGIN > select ARRAY['Danny','Eissam','Moshe'] into x; > end; > $Z$ LANGUAGE 'plpgsql' VOLATILE; > > =========================================== > > CREATE OR REPLACE FUNCTION callarr() > returns integer > AS > $Z$ > DECLARE > x varchar[6]; > BEGIN > perform arr(x); > RAISE NOTICE 'x[1]=%',x[1]; > return 0; > end; > $Z$ LANGUAGE 'plpgsql' VOLATILE; > > =========================================== > > select callarr(); > NOTICE: x[1]=<NULL> ??? Should have been DANNY > > > Should it work? > > Thanks > > Danny > > ---------------------------(end of broadcast)--------------------------- > TIP 5: don't forget to increase your free space map settings >
Danny Abraham wrote: > =========================================== > > CREATE OR REPLACE FUNCTION arr( inout x varchar[] ) > AS > $Z$ > DECLARE > i integer; > BEGIN > select ARRAY['Danny','Eissam','Moshe'] into x; > end; > $Z$ LANGUAGE 'plpgsql' VOLATILE; > > =========================================== > > CREATE OR REPLACE FUNCTION callarr() > returns integer > AS > $Z$ > DECLARE > x varchar[6]; > BEGIN > perform arr(x); > RAISE NOTICE 'x[1]=%',x[1]; > return 0; > end; > $Z$ LANGUAGE 'plpgsql' VOLATILE; > > =========================================== > > select callarr(); > NOTICE: x[1]=<NULL> ??? Should have been DANNY > > > Should it work? Not the way you wrote it. You are confused by output parameters which do not work the way one might expect. They are just a simple syntax for composite return types. CREATE FUNCTION arr(INOUT x varchar[]) is synonymous to CREATE FUNCTION arr(x varchar[]) RETURNS varchar[] So your example should work if you replace PERFORM arr(x); with x := arr(x); Yours, Laurenz Albe