Xpoint
   [напомнить пароль]

MaxDB. Объявление переменной в процедуре, которая возвращает курсор. Разве нельзя?

Метки: [без меток]
2006-05-14 20:06:56 [обр] wDevil[досье]

Входные данные: ID_PAGE, ID_KEYWORD
Задача: получить список реклам для показа, на основе входных данных, учтя все необходимые условия. Сделать проплаты для выбранных реклам. Все это одним запросом.
В условии стоит вызов функции проплаты. Она просто вставляет записи в другую таблицу, точней в таблицу статистики и таблицу проплаты Т.е получается что-то вроде:

SELECT ля-ля-ля,...
FROM ля-ля-ля,...
WHERE ля-ля AND
   pay(id_page,id_ляля)>1 AND
        ...

Проблема в том, при выполнении запроса функция проплаты для каждой рекламы, удовлетворяющей всем условиям, вызывается более одного раза. Т.е получается, что статистка, что проплата для одной рекламы прописывается 2-3 раза. Видимо во время вполнения запроса условия проверяются не единожды для каждой записи. Решил это обойти реализовав все это либо функцией, либо процедурой. Так как у меня в результате может быть более одной записи, мне нужно чтобы возвращался курсор. В MaxDB, как я понял, курсор может возвращать только процедура. Но и тут не все гладко, а именно паходу нельзя объявлять переменые в процедуре, если объявлено что она возращает результат - курсор, по крайне мере что-то подобное вызывает ошибку:

CREATE DBPROC hotels_of_town (IN zip CHAR(5))
RETURNS CURSOR AS
$CURSOR = 'HOTEL_CURSOR';
VAR temp_var INT;
DECLARE :$CURSOR CURSOR FOR
SELECT * FROM mona.hotel WHERE zip = :zip;

Без VAR тож пробовал.
Документация у MAxDB оставляет желать лучшего и опыта у меня мало. Может просто как-то иначе можно объявить переменные? Или какой-то иной выход? А так бы было все просто: объявил бы курсор, выбрал рекламы в него, которые нужно показать, далее FETCH INTO и в цикле сделал проплаты. Если решение очевидно и я ступил, ногами не пинать, ет мой первый более менее сложный проект с точки зрения БД, до этого был мускул и простейшие SELECT/INSERT/UPDATE :)

Powered by POEM™ Engine Copyright © 2002-2005