Re: arrays and pl/pgsql?
От | Guy Fraser |
---|---|
Тема | Re: arrays and pl/pgsql? |
Дата | |
Msg-id | 3E550B35.2070501@incentre.net обсуждение исходный текст |
Ответ на | arrays and pl/pgsql? (Richard Welty <rwelty@averillpark.net>) |
Список | pgsql-general |
Brandon Craig Rhodes wrote: > Richard Welty <rwelty@averillpark.net> writes: > > >>given the lack of response, i'm going to presume that there is no published >>material on arrays and pl/pgsql >> >>can someone please 1) clearly state on whether arrays work in pl/pgsql and >>2) if they do, please explain the syntax? > > > In PL/pgSQL you can declare arrays, set the value of arrays, and > reference array members; I have not discovered any way of setting > individual array members without having to re-set the entire array. > Does ; array[2] := 5; work? In psql ; update array_table set array[2] = '5' ; does work. > An example procedure follows: > > CREATE FUNCTION try_array() RETURNS INTEGER AS ' > DECLARE > array INTEGER[]; > number INTEGER; > BEGIN > array := ''{3,4,6}''; > number := array[1]; > RAISE NOTICE ''First element is %'', number; > number := array[2]; > RAISE NOTICE ''Second element is %'', number; > number := array[3]; > RAISE NOTICE ''Third element is %'', number; > array := ''{3,4,12}''; > number := array[3]; > RAISE NOTICE ''Third element is now %'', number; > RETURN NULL; > END; > ' LANGUAGE 'plpgsql'; > You could determine the number of elements in the array then use a loop to itterate your array to display the values as well. Here is a collection of stuff that does something similar. CREATE TYPE mail_aliases_list_type AS (a_mailbox text, a_destination_el text, a_dest_el_id integer, a_dest_total integer); CREATE FUNCTION mail_aliases_list () RETURNS SETOF mail_aliases_list_type AS ' DECLARE rec record; retrec record; low int; high int; BEGIN FOR rec IN SELECT a_mailbox, a_destination FROM mail_aliases LOOP SELECT INTO low replace(split_part(array_dims(rec.a_destination),'':'',1),''['','''')::int; IF low IS NULL THEN low := 1; high := 1; ELSE SELECT INTO high replace(split_part(array_dims(rec.a_destination),'':'',2),'']'','''')::int; IF high IS NULL THEN high := 1; END IF; END IF; FOR i IN low..high LOOP SELECT INTO retrec rec.a_mailbox, rec.a_destination[i], i::int, high ; RETURN NEXT retrec; END LOOP; END LOOP; RETURN; END; ' LANGUAGE plpgsql IMMUTABLE STRICT; CREATE VIEW mail_alias_list AS SELECT mail_aliases_list.a_mailbox, mail_aliases_list.a_destination_el, mail_aliases_list.a_dest_el_id, mail_aliases_list.a_dest_total FROM mail_aliases_list();
В списке pgsql-general по дате отправления: