SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.03.2010 08:20:00

Наталья
Участник
Зарегистрирован: 23.03.2010
Сообщений: 12

Курсоры

Не получается в хранимой процедуре описать курсор:
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$$

Возникает ошибка:


Прикрепленные файлы:
Attachment Icon Ошибка2.bmp, Размер: 745,974 байт, Скачано: 827

Неактивен

 

#2 25.03.2010 08:22:44

Наталья
Участник
Зарегистрирован: 23.03.2010
Сообщений: 12

Re: Курсоры

Подскажите, пожалуйста, в чем проблема???  таблица TMP_table1 перед курсором описана

Неактивен

 

#3 25.03.2010 13:19:41

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Курсоры

Ошибка в Вашем клиенте. В моём работает даже с неопределенной
таблицей:

Код:

[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 и выполняет команду по точке с запятой.

Неактивен

 

#4 26.03.2010 11:06:09

Наталья
Участник
Зарегистрирован: 23.03.2010
Сообщений: 12

Re: Курсоры

Отдельно данная строка выполняется, а вот в коде процедуры нет. Прилагаю процедуру:

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$$

Неактивен

 

#5 26.03.2010 14:13:41

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Курсоры

Курсоры нужно объявлять (DECLARE) в начале процедуры, а открывать
можно уже в нужном месте.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson