использование массивов

Всем привет!
Только начал изучать postgresql, так что многого еще не знаю, прошу учесть это при ответах)
Дело такое. Функция заполняет таблицу. В функцию передается список полей и список значений (например, передается одно поле и одно значение этого поля для вставки в таблицу). Передается в двух массивах (name - имена полей таблицы, val - массив значений этих полей)
Я так понимаю, делается это примерно так:

CREATE FUNCTION "public"."%funcname%" (name text [15], val text [15]) RETURNS integer AS
$body$
BEGIN
    INSERT INTO %tablename% (
  			name[1],
                        name[2],
                            ...
                        name[15])
  	VALUES (
            		val[1],
                        val[2],
                            ...
                        val[15]);
            RETURN 0;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;

Выдается ошибка:

ERROR:  syntax error at OR near "$1"
LINE 1: INSERT INTO %tablename%(  $1 [1],  $1 [2],  $1 [3],  $1 [4],  $...

Использую EMS SQL MANAGER 2007

Вот не могу понять, что именно не правильно...
Заранее спасибо.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

По-моему вам читать

По-моему вам читать здесь:
http://postgresql.ru.net/docs/extented_FAQ.html#Q003

ага, спасибо, понял. Но как

ага, спасибо, понял. Но как поступить если первоначально не известно какие поля будут переданы? Вот, например, меняется одно поле, оно одно и передается, неужели надо все поля передавать из-за изменения одного? или есть какой-нибудь способ?

Вроде бы в FAQ довольно

Вроде бы в FAQ довольно понятно объяснено, что хранимые процедуры должны работать только с ЯВНО указанными полями таблицы. И я, например, считаю это правильным (хотя и в ряде случаев неудобным), потому что такой подход существенно уменьшает вероятность появления ошибок, связанных с нестыковкой типов и отсутствием полей в таблицах в момент выполнения самой хранимой процедуры.

Если мне позволено будет пофилософствовать, то могу сказать, что вообще изменять структуру БД с помощью хранимых процедур - это дурной тон! Не для того они предназначены - они для ОБРАБОТКИ данных в таблицах, для вставки и удаления, но никак не для изменения структуры самих таблиц. Разумеется - это моё личное мнение.

Что касается способов, то данный вопрос поднимался на этом форуме не один раз, собственно поэтому и попал в FAQ.
Если бы вы воспользовались поиском, то могли бы найти ссылки на похожие темы:
http://postgresql.ru.net/node/213855
http://postgresql.ru.net/node/213859
Там предлагается два метода решения, но я не знаю насколько они рабочие и рабочие ли вообще

по-моему вы меня не так

по-моему вы меня не так поняли. при чем тут изменение структуры? где в моей функции вы видите изменение структуры таблиц? у меня функция как раз ВСТАВЛЯЕТ значения, занимается прямыми обязанностями!
Тут на вход подается просто два текстовых массива. Один содержит имена полей таблицы, а второй их значения. Структура не меняется - функция просто вставляет указанные значения в указанные поля...
Мне интересно почему она не работает, вроде негде ошибиться то...

Вроде бы я уже довольно

Вроде бы я уже довольно внятно вам написал почему она не работает.
Напишите вместо name[1], name[2] реальные имена полей таблицы и думаю заработает.

спасибо за помощь, не

спасибо за помощь, не серчайте на меня, я только учусь =))

тут еще вопрос как раз по

тут еще вопрос как раз по этой теме. Можно ли создавать функции динамически и если можно, дайте пожалуйста ссылку, где про это почитать можно. Погуглил - вроде ничего вменяемого не нашел.
Грубо говоря, загоняем текст вида "create function FOOO..." в переменную FN, а потом делаем execute FN или там select FOO... Думаю, понятно чего требуется)))

Если функция на момент

Если функция на момент создания имеет всё что нужно в чётко прописанном виде, то почему бы нет?
Попробуйте.

Все, с этим разобрался,

Все, с этим разобрался, ура))
Собирается запрос в процессе выполнения функции, а потом в конце выполняется. Вот так.

Теперь еще небольшой вопрос: как узнать кол-во эл-тов одномерного массива? icount(%array%) не работает. пишет что функции такой нету, хотя скомпилировался нормально...странно

array_upper (ARRAY[],1)

array_upper (ARRAY[],1)

не получается использовать

не получается использовать это для передаваемого в функцию массива. т.е. у меня передается массив переменной длины в функцию и мне надо посчитать его размер в функции.
А при использовании того что вы написали при компиляции выдается ошибка:

ERROR:  syntax error at OR near "array_upper"
LINE 1: array_upper ( $1 [],1)
        ^
QUERY:  array_upper ( $1 [],1)
CONTEXT:  SQL statement IN PL/PgSQL FUNCTION "updstudent" near line 7

Как починить может знаете?)

а точку с запятой ставить

а точку с запятой ставить пробовали. вообще перед тем как что-то делать не мешало бы почитать хоть что-то.

вот блин,

вот блин, стыдно...спасибо.
Может я конечно не много знаю, но кое-что почитал и точку с запятой знаю что ставить надо(((( невнимательность...
точнее даже не невнимательность. Просто я пытался сразу в цикле использовать вот так:
FOR i IN 1..array_upper(%array%,1) LOOP
Сделал через переменную и все замечательно =)

Вот ни как не могу понять, а

Вот ни как не могу понять, а зачем вообще такая функция?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023