Instaltiating an ARRAY within a function

Started by Abraham, Dannyover 18 years ago3 messagesgeneral
Jump to latest
#1Abraham, Danny
danny_abraham@bmc.com

===========================================

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

#2Pavel Stehule
pavel.stehule@gmail.com
In reply to: Abraham, Danny (#1)
Re: Instaltiating an ARRAY within a function

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

Show quoted text

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

#3Laurenz Albe
laurenz.albe@cybertec.at
In reply to: Abraham, Danny (#1)
Re: Instaltiating an ARRAY within a function

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