Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/56: Рейтинг темы: голосов - 56, средняя оценка - 4.68
3 / 3 / 0
Регистрация: 14.09.2010
Сообщений: 11
1

Ошибка в процедуре

09.02.2011, 17:54. Показов 10271. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. есть такой вопрос. необходимо написать процедурку которая из одной таблицы добавляла новые данные в другую.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
--CREATE OR REPLACE PROCEDURE SUM_MR 
 
DECLARE DATE1 DATE;
        DATE2 DATE;
        count_zv NUMBER(20);
        sum_un NUMBER(20);
        inc_port varchar2(10);
        out_port varchar2(10);
 
cursor date_max IS 
    SELECT MAX(TO_DATE(DATE_TIME,'DD-MM-YYYY')) 
    FROM ccas_u.summr;
 
cursor sum_units IS 
        SELECT COUNT(*), SUM(units), TO_DATE(START_TIME,'DD-MM-YYYY'), incoming_route, outgoing_route 
        FROM ccas_u.raw_cdr_MR32
            WHERE START_TIME >TO_DATE(DATE1,'DD-MM-YYYY')
            AND START_TIME<TO_DATE(trunc(sysdate - 1,'month'))
       GROUP BY TO_DATE(START_TIME,'DD-MM-YYYY'), incoming_route, outgoing_route;
       
    
BEGIN
  
    OPEN date_max; 
    fetch date_max INTO DATE1;
    DBMS_OUTPUT.enable;
    DBMS_OUTPUT.put_line('date: ');
    DBMS_OUTPUT.put_line('date2: '||TO_DATE(DATE1,'DD-MM-YYYY'));
    close date_max;
    
    OPEN sum_units;
        --LOOP
            --EXIT WHEN sum_units%NOTFOUND;
            fetch sum_units INTO count_zv, sum_un, DATE2, inc_port, out_port;
            DBMS_OUTPUT.enable;
            DBMS_OUTPUT.put_line('date3: '|| count_zv);
            INSERT INTO summr (ZVONKOV, SUM_UNITS,  DATE_TIME, INCOMING_ROUTE, OUTGOING_ROUTE) VALUES (count_zv, sum_un, DATE2, inc_port, out_port);
        --END LOOP;
    close sum_units;
    
    
END;
/
возможно я что то не так пишу, но если не использовать цикл то код отрабатывает один раз корректно.
если же использовать цикл, то появляется ошибка ORA-06502: PL/SQL: : буфер символьных строк слишком маленький ошибка числа или значения.
что именное ее вызывает?
и второй вопрос как потом это счастье правильно в процедуру оформить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2011, 17:54
Ответы с готовыми решениями:

Ошибка в процедуре
Добрый день, вечер, ночь. При проверке включения одного круга в другой программа вылетает, можете...

Ошибка в процедуре
Нужно написать подпрограмму (процедуру), которая находит в массиве адрес числа N в интервале от...

Ошибка в процедуре
помогите найти ошибку (где-то в процедуре sum) unit lab16; interface type mas=arrayof integer;...

Ошибка в процедуре
Здравствуйте. Не могу понять, у меня почему то не работает функция proc в maple. Не могу понять что...

12
64 / 44 / 6
Регистрация: 10.01.2010
Сообщений: 99
10.02.2011, 08:56 2
А в какой строке ошибка? Вполне может быть, что это из-за put_line, там буфер ограничен. Если очень много данных, то будет ошибка.

Добавлено через 1 минуту
А что бы была процедура строчку CREATE OR REPLACE PROCEDURE SUM_MR раскоментируйте, а declare на is замените.
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
10.02.2011, 10:27 3
1. зачем в цикле на каждом шаге делать DBMS_OUTPUT.enable ?
Его достаточно вызвать один раз в еачале процедуры

2. зачем столько to_date? Что, все поля date_time, date1 и т.д. символьные?
А уж тут TO_DATE(trunc(sysdate - 1,'month')) sysdate - всяко дата

3. для работы с курсором существует вторая форма через for - loop, что гораздо удобнее, особенно для второго курсора

4. если все же хочещь использовать эту (твою) форму, то NOTFOUND проверяют ПОСЛЕ FETCH, а не ДО

5. ошибка может возникать из-за того, что либо при FETCH, либо при INSERT часть полей не совпадают по размеру с размерами переменных (при FETCH ты хочешь прочитать больший размер, чем позволяет переменная, при INSERT - записать большее в меньшее)

Рекомендую почитать доку под названием PL/SQL User Guide and Reference
0
3 / 3 / 0
Регистрация: 14.09.2010
Сообщений: 11
10.02.2011, 10:52  [ТС] 4
спасибо, пункты 1-4 учту, а вот с переменными все в порядке, проверяла специально, видимо дело в put_line.
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
10.02.2011, 11:43 5
put_line здесь ни при чем. Если бы у тебя на каждом шаге цикла длина переменной увеличивалась (например, конкатенация доп. кусочка), тогда да.
Для справки - размер аргумента для put_line в Ora 9 - varchar2(256), начиная с Ora 10 - 32K
0
3 / 3 / 0
Регистрация: 14.09.2010
Сообщений: 11
10.02.2011, 11:45  [ТС] 6
тогда почему один раз все отрабатывает корректно?
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
10.02.2011, 11:57 7
Например, в одной строке данные удовлетворяют размерам (скажем, varchar2), а в другой нет. Ведь varchar2, независимо от указанной длины, хранит ровно столько, сколько в него записано.
Я бы без всякой процедуры выполнил SELECT из второго курсора и глянул на данные
0
3 / 3 / 0
Регистрация: 14.09.2010
Сообщений: 11
10.02.2011, 17:35  [ТС] 8
вопрос с циклом решила, убрала DBMS_OUTPUT.enable и put_line и все заработало)))
теперь другой очень глупый вопрос про дату... не необходимо выбрать данные в формате дата-месяц-год-час, а затем их записать в таком же формате. можно как то указать шаблон без преобразования типов?
0
64 / 44 / 6
Регистрация: 10.01.2010
Сообщений: 99
13.02.2011, 12:33 9
Grossmeister, вы не учитываете программу в которой выполняется процедура. Например, в PL/SQL Developer описанная мной ошибка имеет место, так буфер вывода ограничен.

selik, если дату выбрали со временем, то и вставиться она должна так же.
0
2 / 2 / 0
Регистрация: 25.02.2011
Сообщений: 4
26.02.2011, 00:03 10
На мой взгляд ни курсоры, ни переменные не нужны: используйте обычный sql, его для вашей задачи достаточно и более прозрачно все будет:
INSERT INTO summr select ...;
commit;
0
3 / 3 / 0
Регистрация: 14.09.2010
Сообщений: 11
28.02.2011, 11:25  [ТС] 11
мне нужно было что бы задание выполнялось ежедневно по расписанию, потому решила использовать job и соответственно написать процеру
0
2 / 2 / 0
Регистрация: 25.02.2011
Сообщений: 4
28.02.2011, 17:04 12
Цитата Сообщение от selik Посмотреть сообщение
мне нужно было что бы задание выполнялось ежедневно по расписанию, потому решила использовать job и соответственно написать процеру
Никто не мешает написать процедуру просто из SQL, не прибегая pl/sql. Например:
begin
INSERT INTO summr select ...;
commit;
end;
Джобу это не помешает. Зато вы будете удивлены скоростью работы: эта конструкция на порядок быстрее pl/sql.
Но если вам нужен был именно pl/sql в учебных целях - тогда, конечно, ваш код правильный.
1
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
01.03.2011, 13:24 13
Цитата Сообщение от До Посмотреть сообщение
Никто не мешает написать процедуру просто из SQL, не прибегая pl/sql. Например:
begin
INSERT INTO summr select ...;
commit;
end;
Скажу по секрету: процедуру на SQL написать нельзя, поскольку в SQL процедур НЕТ. В данном случае этот текст такой же PL/SQL, как и предыдущие тексты (а значит, будет происходить переключение контекста между PL/SQL и SQL машинами).
Другое дело, что если можно сделать операцию одним оператором, а не проходя по каждой записи вручную, то это значительно увеличит скорость - такое дело имеет место быть.
Но применение PL/SQL для job этого не отменяет
0
01.03.2011, 13:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2011, 13:24
Помогаю со студенческими работами здесь

Ошибка в процедуре
Есть алгоритм, который вроде записан правильно. Но в тоже время вылезают разные ошибки и код не...

Ошибка в процедуре
Здравствуйте! Вот код: Function Acos(ByVal a As Double) As Double If a = 1 Then Acos = 0...

Ошибка в процедуре
procedure TForm1.btn3Click(Sender: TObject); var q, i,g:Integer; begin...

Ошибка в процедуре
Написала программу и ошибок паскаль не выявляет,но при тестировании программы процедура...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru