обработка ARRAY в plpgsql или правильный синтаск "FOREACH array LOOP"

Resu

Новичок
обработка ARRAY в plpgsql или правильный синтаск "FOREACH array LOOP"

я ищу правильный синтакс для цикла
FOREACH .. array LOOP

end LOOP

в функции plpgsql
я создаю массив ID значений в PHP странице и передаю его в plpgsql функцию, где и хочу его обработать. то есть нечто вроде:

PHP:
PHP:
$query="SELECT my_func( ..., '{1,2,4,7,12}')"
plpgsql:
FOREACH v_from_array $2 LOOP
INSERT INTO my_table_2 (..) VALUES ( .., v_from_array)
END LOOP;

но ни нахожу функцию определяющую длину массива, ни синтакс FOREACH .. LOOP

или может такую задачу можно решить как то иначе?
в любом случае - спасибо за помощь.

Resu
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Синтаксис foreach ты и не найдёшь, ибо его там нету. Есть зато FOR:
Код:
CREATE OR REPLACE FUNCTION test_array(integer[])
RETURNS VOID
AS $$
DECLARE
  ary ALIAS FOR $1;
  val integer;
BEGIN
  FOR i IN 1..array_upper(ary, 1) LOOP
  	val := ary[i];
    RAISE NOTICE 'array element % is %', i, val;
  END LOOP;
  RETURN NULL;
END;
$$ LANGUAGE plpgsql;
 

Resu

Новичок
большое спасибо,
однако я забыл упомянуть, что я использую pgSQL v 7.3 - а в ней, кажется, такой функции - нет.

ворос - что делать?
(нет я понимау что пойдут предложения ставить 8.0x. а можно ли обойтись средствами plpgsql?)

-~{}~ 25.07.05 17:19:

кажется, такой функции - нет.

array_upper - я имел в виду!


пока что я сделал plpgsql функцию, которая переберает переданную ей строку на символы "{" и ",".
и берет из нее только integer числа .
 

BOJIK

Новичок
Попробуй перебора массива через while
Например так (проверил на pgsql 7.4.6):
PHP:
CREATE OR REPLACE FUNCTION test_array(integer[]) RETURNS boolean AS '
	DECLARE
		i INTEGER;
		arr ALIAS FOR $1;
		val INTEGER;
	BEGIN
		i := 1;
		WHILE arr[i] IS NOT NULL LOOP
			val := arr[i];
			RAISE NOTICE ''%'', val; 
			i := i + 1;
		END LOOP;
		RETURN true;
	END;
' LANGUAGE plpgsql;
SELECT test_array('{1,2,4,7,12}');
 

Resu

Новичок
спасибо. звучит очень даже многообещающе.
(разборка строки длится наверняка дольше)
при первой же возможности реализую ету идею
(заодно и протестирую время выполнения)
 
Сверху