3 / 3 / 0
Регистрация: 14.09.2010
Сообщений: 11
|
||||||
1 | ||||||
Ошибка в процедуре09.02.2011, 17:54. Показов 10271. Ответов 12
Метки нет (Все метки)
Добрый день. есть такой вопрос. необходимо написать процедурку которая из одной таблицы добавляла новые данные в другую.
если же использовать цикл, то появляется ошибка ORA-06502: PL/SQL: : буфер символьных строк слишком маленький ошибка числа или значения. что именное ее вызывает? и второй вопрос как потом это счастье правильно в процедуру оформить?
0
|
09.02.2011, 17:54 | |
Ответы с готовыми решениями:
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 |
Никто не мешает написать процедуру просто из 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 написать нельзя, поскольку в SQL процедур НЕТ. В данном случае этот текст такой же PL/SQL, как и предыдущие тексты (а значит, будет происходить переключение контекста между PL/SQL и SQL машинами).
Другое дело, что если можно сделать операцию одним оператором, а не проходя по каждой записи вручную, то это значительно увеличит скорость - такое дело имеет место быть. Но применение PL/SQL для job этого не отменяет
0
|
01.03.2011, 13:24 | |
01.03.2011, 13:24 | |
Помогаю со студенческими работами здесь
13
Ошибка в процедуре Ошибка в процедуре Ошибка в процедуре Ошибка в процедуре Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |