Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Курсор и Oracle 11g


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

Код

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

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

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

Автор: darkvivi 11.6.2013, 19:02
Спасибо)

Автор: шКОДЕР 26.9.2013, 15:29
Код

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


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

Автор: Zloxa 26.9.2013, 15:39
Цитата(шКОДЕР @  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 Найти цитируемый пост)
не могу разобраться

а пробовали?

Автор: шКОДЕР 26.9.2013, 15:47
Цитата

а пробовали?


весь день с этим кодом колупаюсь, кучу форумов облазил и мануалов начитался. Вроде все по образцу делал, а получилось "как всегда"

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

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

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

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

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

Автор: шКОДЕР 27.9.2013, 10:14
С конструкцией запроса разобрался, но появилась еще одна ошибка в первой строке, компилятор ругается на входящий параметр



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;


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

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

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

Автор: шКОДЕР 27.9.2013, 12:51
Цитата(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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)