Всем привет!
Только начал изучать 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)
не получается использовать
не получается использовать это для передаваемого в функцию массива. т.е. у меня передается массив переменной длины в функцию и мне надо посчитать его размер в функции.
А при использовании того что вы написали при компиляции выдается ошибка:
Как починить может знаете?)
а точку с запятой ставить
а точку с запятой ставить пробовали. вообще перед тем как что-то делать не мешало бы почитать хоть что-то.
вот блин,
вот блин, стыдно...спасибо.
Может я конечно не много знаю, но кое-что почитал и точку с запятой знаю что ставить надо(((( невнимательность...
точнее даже не невнимательность. Просто я пытался сразу в цикле использовать вот так:
FOR i IN 1..array_upper(%array%,1) LOOP
Сделал через переменную и все замечательно
Вот ни как не могу понять, а
Вот ни как не могу понять, а зачем вообще такая функция?