Обсуждение: FW: plpgsql function help
Hello,
I am trying to get a function to return an integer field pulled from a different database using dblink. I am getting a run-time error. Here is the function and the error:
CREATE OR REPLACE FUNCTION get_db_id()
RETURNS INTEGER AS
$BODY$
DECLARE
client_ids INTEGER[];
db_id INTEGER;
BEGIN
SELECT INTO client_ids DISTINCT client_id FROM clients;
SELECT INTO db_id dblink('dbname=system',
'SELECT database_id FROM clients WHERE client_id = '||client_ids[0]);
RETURN db_id;
END;
$BODY$
LANGUAGE 'plpgsql' IMMUTABLE
COST 100;
********** Error **********
ERROR: array value must start with "{" or dimension information
SQL state: 22P02
Context: PL/pgSQL function "get_db_id" line 5 at SQL statement
Can anyone tell me what I’m doing wrong?
Thanks,
Tyler Hains
ProfitPoint, Inc.
In response to Tyler Hains :
> Hello,
>
>
>
> I am trying to get a function to return an integer field pulled from a
> different database using dblink. I am getting a run-time error. Here is the
> function and the error:
>
>
>
> CREATE OR REPLACE FUNCTION get_db_id()
>
> RETURNS INTEGER AS
>
> $BODY$
>
> DECLARE
>
> client_ids INTEGER[];
>
> db_id INTEGER;
>
> BEGIN
>
> SELECT INTO client_ids DISTINCT client_id FROM clients;
>
>
>
> ERROR: array value must start with "{" or dimension information
>
> SQL state: 22P02
>
> Context: PL/pgSQL function "get_db_id" line 5 at SQL statement
>
>
>
>
>
> Can anyone tell me what I?m doing wrong?
You have defined client_ids as INT[], but your select returns a SET of
integers. You can change it to :
SELECT INTO client_ids array_agg(DISTINCT client_id) FROM clients;
Regards, Andreas
--
Andreas Kretschmer
Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header)
GnuPG: 0x31720C99, 1006 CCB4 A326 1D42 6431 2EB0 389D 1DC2 3172 0C99
Alas, I'm running version 8.3. Is there an easy way to do it in 8.3? Can
I create that function in 8.3, or is it dependent upon other 8.4
features? Would it cause any migration issues later? Where can I find
the function without downloading all of the 8.4 source?
Thanks!
Tyler Hains
ProfitPoint, Inc.
www.profitpointinc.com
-----Original Message-----
From: A. Kretschmer [mailto:andreas.kretschmer@schollglas.com]
Sent: Tuesday, March 30, 2010 9:03 AM
To: pgsql-novice@postgresql.org
Subject: Re: [NOVICE] FW: plpgsql function help
In response to Tyler Hains :
> Hello,
>
>
>
> I am trying to get a function to return an integer field pulled from a
> different database using dblink. I am getting a run-time error. Here
is the
> function and the error:
>
>
>
> CREATE OR REPLACE FUNCTION get_db_id()
>
> RETURNS INTEGER AS
>
> $BODY$
>
> DECLARE
>
> client_ids INTEGER[];
>
> db_id INTEGER;
>
> BEGIN
>
> SELECT INTO client_ids DISTINCT client_id FROM clients;
>
>
>
> ERROR: array value must start with "{" or dimension information
>
> SQL state: 22P02
>
> Context: PL/pgSQL function "get_db_id" line 5 at SQL statement
>
>
>
>
>
> Can anyone tell me what I?m doing wrong?
You have defined client_ids as INT[], but your select returns a SET of
integers. You can change it to :
SELECT INTO client_ids array_agg(DISTINCT client_id) FROM clients;
Regards, Andreas
--
Andreas Kretschmer
Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header)
GnuPG: 0x31720C99, 1006 CCB4 A326 1D42 6431 2EB0 389D 1DC2 3172 0C99
--
Sent via pgsql-novice mailing list (pgsql-novice@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-novice
In response to Tyler Hains : > Alas, I'm running version 8.3. Is there an easy way to do it in 8.3? Can > I create that function in 8.3, or is it dependent upon other 8.4 > features? Would it cause any migration issues later? Where can I find > the function without downloading all of the 8.4 source? Okay, no problem ;-) You can write a own aggregate, see: http://www.postgresql.org/docs/current/static/xaggr.html search for CREATE AGGREGATE array_accum Please, no top-posting and fullquote below, okay? Andreas -- Andreas Kretschmer Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header) GnuPG: 0x31720C99, 1006 CCB4 A326 1D42 6431 2EB0 389D 1DC2 3172 0C99