Задавайте вопросы, мы ответим
Вы не зашли.
Не получается в хранимой процедуре описать курсор:
DELIMITER $$
CREATE PROCEDURE OBOROT_SO (In NumTmc decimal(11), /* ном.номер*/
In Price float, /* учет.цена*/
In Uperiod int) /* учет.период*/
BEGIN
DECLARE cur1 CURSOR FOR SELECT * FROM TMP_table1;
end$$
Возникает ошибка:
Неактивен
Подскажите, пожалуйста, в чем проблема??? таблица TMP_table1 перед курсором описана
Неактивен
Ошибка в Вашем клиенте. В моём работает даже с неопределенной
таблицей:
[aquatica] root test > DELIMITER $$ [aquatica] root test > CREATE PROCEDURE OBOROT_SO (In NumTmc decimal(11), /* ном.номер*/ -> In Price float, /* учет.цена*/ -> In Uperiod int) /* учет.период*/ -> BEGIN -> -> DECLARE cur1 CURSOR FOR SELECT * FROM TMP_table1; -> end$$ Query OK, 0 rows affected (0,10 sec)
Скорее всего, он не понимает DELIMITER и выполняет команду по точке с запятой.
Неактивен
Отдельно данная строка выполняется, а вот в коде процедуры нет. Прилагаю процедуру:
DELIMITER $$
CREATE PROCEDURE OBOROT_SO (In NumTmc decimal(11), /* ном.номер*/
In Price float, /* учет.цена*/
In Uperiod int) /* учет.период*/
BEGIN
/* 1 */
/* Создание временной таблицы1*/
/* В нее добавляем все приходы*/
CREATE TEMPORARY TABLE TMP_table1 ( DatD int, /* месяц прихода */
Kol float, /* количество */
KolMes smallint/* срок использования в мес.*/
);
/* Создание временной таблицы2*/
/* Из #TMP_Table переносим по месяцам приходы/расходы*/
CREATE TEMPORARY TABLE TMP_table2 ( DatD int, /* месяц */
Prixod float, /* сумма приходов */
Rasxod float /* сумма расходов */
);
/* 2 */
/* ДОБАВЛЕНИЕ ДАННЫХ из документов - требования(вед-ть выдачи хоз.инв.) */
INSERT INTO TMP_table1 VALUES (DatD,Kol,KolMes);
SELECT DOKUM.DATD,SUM(DOKUMS.KOL),DOKUMS.SROK
FROM DOKUMS LEFT OUTER JOIN DOKUM ON DOKUMS.UN = DOKUM.UN
WHERE DOKUM.VID_DOK = 17 AND DOKUMS.SROK > 12 AND DOKUMS.NUM_TMC = NumTmc AND DOKUM.DATD>=73783
GROUP BY DOKUM.DATD,DOKUMS.SROK
ORDER BY DOKUM.DATD;
/* 3 */
/* Заполнение таблицы приходов/расходов */
/* от мин.даты прихода до текущего месяца */
SELECT @DatMin = MIN(DatD) FROM TMP_table1 ;
WHILE @DatMin <= Uperiod Do
INSERT INTO TMP_table2 VALUES (DatD,Prixod,Rasxod);
SELECT @DatMin,0.00,0.00;
SELECT @DatMin = DATEDIFF('1800-12-28', ADDDATE(ADDDATE('1800-12-28', Interval 5 day), INTERVAL 1 month));
END WHILE;
/* 4 */
/* Для каждой строки прихода считаем приходы и расходы и прибавляем к месяцам */
DECLARE curs CURSOR FOR SELECT * FROM TMP_table1;
-- open curs;
end$$
Неактивен
Курсоры нужно объявлять (DECLARE) в начале процедуры, а открывать
можно уже в нужном месте.
Неактивен