Доброго времени суток, я новичок в PostgreSQL. У меня есть задача, которая сводится к следующей -
написать функцию, которая возвращает таблицу-результат. Таблица-результат есть SELECT из двух таблиц, причем имена этих таблиц и имена колонок - параметры функции. Для простоты пример -
CREATE TABLE table1(
id int,
myText varchar(20)
.....
);
CREATE TABLE table2(
id int,
myText varchar(20)
.....
);
SELECT table1.id,table2.myText FROM table1,table2;
Я не понимаю
1) как воспользоватся именами таблиц и колонок для формирования селекта
2) как правильно вернуть таблицу?
Есть ограничение по функционалу - PostgreSQL 8.3, только plpgsql. Надеюсь на Вашу поддержку.
http://postgresql.ru.net/docs
http://postgresql.ru.net/docs/extented_FAQ.html#Q003
можно обойти используя EXECUTE
А каким образом? Можно ссылку на пример?
или хотя бы направление идеи
Можно
http://postgresql.ru.net/node/127707
на текущий момент имею следующий текст
CREATE OR REPLACE FUNCTION intersek(varchar, varchar,int, varchar ) RETURNS
SETOF record AS
$$
DECLARE
r record%rowtype;
qry text;
BEGIN
qry := "SELECT "||$1||".objectID, "|| $2 ||"."|| $4 ||", st_area(st_intersection("|| $1 ||".geom,"|| $2 ||".geom)) FROM "||$1||","||$2|| "
WHERE "||$1||".objectID="||$3||;
FOR r IN EXECUTE qry
LOOP
RETURN NEXT r;
END LOOP;
RETURN;
END
$$
language 'plpgsql';
оно компилится, но при действии
SELECT * FROM intersek('first','second',2,'objName') AS record(objID int, objName varchar,area int)
отвечает фразой column notation .objectid applied to type text, which is not a composite type
Как это вылечить? Старый ФИДОшный метод типа руки к батарее- не помогает
> column notation .objectid
> column notation .objectid applied to type text, which is not a composite type
нотация колонки .objectid применяется к типу text, который не является составным.
Т.е. в имени поля у вас точка, значит PostgreSQL считает, что вы хотите получить значение составного типа, что очевидно не так. Исправить так, чтобы не было точки я полагаю
Я понимаю в чем ошибка, но не понимаю как ее исправить
собственно, разумен ли вообще такой способ решения задачи? И если да, то как можно избавится от этой ошибки?
1. Способ решения не очень
1. Способ решения не очень правильный, но допустимый
2. Избавится разумеется можно, но я не знаю ваших таблиц и что вы хотите, поэтому более детальный совет вам дать не могу