Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Курсор и Oracle 11g, Помогите, пожалуйста, понять курсоры 
:(
    Опции темы
darkvivi
Дата 10.6.2013, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.9.2008

Репутация: нет
Всего: 1



 Всем доброго времени суток! Я сейчас пытаюсь понять тему Курсоры: что это вообще такое, почему оно используется и как оно упращает задачку, вот, на одном сайте нашёл код курсора 

Код

DECLARE
    CURSOR get_offices IS
        SELECT * FROM OFFICES;
    -- Объявляется курсор.
    v_gt get_offices%ROWTYPE;
    -- Объявляется переменная запись, где будут хранится данные.
BEGIN
    OPEN get_offices; 
    -- Открывается курсор.
    
    -- Запускается цикл чтения.
    LOOP 
    
        -- Выбираются данные.
        FETCH get_offices INTO v_gt;            
        EXIT WHEN get_offices%NOTFOUND;
                            
    END LOOP;

    -- Закрывается курсор.
    CLOSE get_offices;

END;
/




 Этот код использует некую таблицу, а вот какую-не понятно, и что вообще делает курсор - тоже не понятно..

 Пожалуйста, если можно, приведите готовый пример (+исходная таблица), Всем заранее спасибо! smile

Это сообщение отредактировал(а) darkvivi - 10.6.2013, 18:54
PM MAIL   Вверх
Zloxa
Дата 11.6.2013, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(darkvivi @  10.6.2013,  19:31 Найти цитируемый пост)
 что это вообще такое

курсор это хэндл на область памяти, в которой расположены данные. С помощью курсора осуществляется доступ к данным таблицы.
В твоем примере открыается курсор для доступа к результату запроса "SELECT * FROM OFFICES". Затем данные в цикле построчно считываются в локальную структуру v_gt.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
darkvivi
Дата 11.6.2013, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 24.9.2008

Репутация: нет
Всего: 1



Спасибо)
PM MAIL   Вверх
шКОДЕР
Дата 26.9.2013, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.9.2013

Репутация: нет
Всего: нет



Код

CREATE OR REPLACE FUNCTION in_dek (f_i_o IN VARCHAR2) RETURN VARCHAR2 IS;

 DECLARE
    CURSOR info IS
          SELECT fio, ddate 
        INTO f_i_o, value_date
        FROM test_1
        WHERE flag=1; 
 BEGIN
    FOR rec IN info          
    LOOP
        concate:=CONCAT(f_i_o, value_date);
        INSERT INTO messages (text)
        VALUES (concate);
    END LOOP;
 END in_dek


Вылезла куча ошибок:
Line: 1 Error: PLS-00103: встретился символ ";" в то время как ожидалось одно из следующих: debug function pragma процедура subtype тип <идентификотор>

Line: 5 Error: PLS-00103: Встретился символ "INTO", в то время как ожидалось одно из следующих: ( , * @ % & - + /

Line: 15  Error: PLS-00103: Встретился символ "end-of-file", в то время как ожидалось одно из следующих ";"

Line: 2 Error: Hint: Variable 'DECLARE' is declared but never used in 'in_dek'

Line: 1 Error: Hint: Function 'in_dek' does not return a value


не могу разобраться, помогите пожалуйста

PM MAIL   Вверх
Zloxa
Дата 26.9.2013, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(шКОДЕР @  26.9.2013,  16:29 Найти цитируемый пост)
Line: 1 Error: PLS-00103: встретился символ ";" в то время как ожидалось одно из следующих

В строке 1 неожиданно встретилось запяточие. Там его быть не должно. И declare после запяточия тоже не нужен.

Добавлено @ 15:42
Цитата(шКОДЕР @  26.9.2013,  16:29 Найти цитируемый пост)
Line: 5 Error: PLS-00103: Встретился символ "INTO"

в пятой стоке встретилось into, которое тоже там не к месту
Цитата(шКОДЕР @  26.9.2013,  16:29 Найти цитируемый пост)
Line: 15  Error: PLS-00103: Встретился символ "end-of-file", в то время как ожидалось одно из следующих ";"

не хватает точки запятой в конце пятнадцатой строки
Цитата(шКОДЕР @  26.9.2013,  16:29 Найти цитируемый пост)
Hint: Function 'in_dek' does not return a value

функция от процедуры отличается тем, что таки должна возвращать значение

Добавлено через 4 минуты и 4 секунды
Цитата(шКОДЕР @  26.9.2013,  16:29 Найти цитируемый пост)
не могу разобраться

а пробовали?

Это сообщение отредактировал(а) Zloxa - 26.9.2013, 15:43


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
шКОДЕР
Дата 26.9.2013, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.9.2013

Репутация: нет
Всего: нет



Цитата

а пробовали?


весь день с этим кодом колупаюсь, кучу форумов облазил и мануалов начитался. Вроде все по образцу делал, а получилось "как всегда"
PM MAIL   Вверх
Zloxa
Дата 26.9.2013, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(шКОДЕР @  26.9.2013,  16:47 Найти цитируемый пост)
кучу форумов облазил

а надо было лишь почитать текст ошибок  smile 

Это сообщение отредактировал(а) Zloxa - 26.9.2013, 16:00


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
шКОДЕР
Дата 27.9.2013, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.9.2013

Репутация: нет
Всего: нет



Цитата(Zloxa @ 26.9.2013,  16:00)
Цитата(шКОДЕР @  26.9.2013,  16:47 Найти цитируемый пост)
кучу форумов облазил

а надо было лишь почитать текст ошибок  smile

Как устранить ошибки я в курсе, благо английски неплохо знаю. А вот как грамотную конструкцию подобрать для подобного запроса - в этом проблема. В Oracle новичок.
  есть таблица test_1,  в ней колонка FLAG (значение либо 0, либо 1),  нужно  переместить все записи (а именно ФИО и ДАТУ)  со значением FLAG=1 в таблицу messages в столбец TEXT, причем данные ФИО И Дата необходимо объединить
PM MAIL   Вверх
шКОДЕР
Дата 27.9.2013, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.9.2013

Репутация: нет
Всего: нет



С конструкцией запроса разобрался, но появилась еще одна ошибка в первой строке, компилятор ругается на входящий параметр



1. pls 00320: описание типа этого выражения незавершено или  выполнено неверно

 
Код

CREATE OR REPLACE FUNCTION in_dek(flag In number) RETURN result IS

  result varchar2(120);
BEGIN
  FOR rec IN (SELECT fio, ddate FROM test_1 WHERE flag = 1) LOOP
    result := CONCAT(rec.fio, rec.ddate);
    INSERT INTO messages (text) VALUES (result);
  END LOOP;
  return;
END in_dek;


подскажите, как убрать косяк во входящем параметре?

Это сообщение отредактировал(а) шКОДЕР - 27.9.2013, 10:26
PM MAIL   Вверх
Zloxa
Дата 27.9.2013, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(шКОДЕР @  27.9.2013,  11:14 Найти цитируемый пост)
FUNCTION in_dek(flag In number) RETURN result IS

Здесь ожидается тип


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
шКОДЕР
Дата 27.9.2013, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 26.9.2013

Репутация: нет
Всего: нет



Цитата(Zloxa @ 27.9.2013,  12:34)
Цитата(шКОДЕР @  27.9.2013,  11:14 Найти цитируемый пост)
FUNCTION in_dek(flag In number) RETURN result IS

Здесь ожидается тип

FUNCTION in_dek(flag In number) RETURN varchar2 IS

Спасибо. Заработало smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.0983 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.