Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
Создаю следующую процедуру где создаю временную таблицу и вывожу результать с помощью курсора create procedure myTemp() result set 1 language sql begin declare vr_sum decimal(15,2); declare vr_g33a char(4); declare vr_summa decimal(15,2); declare global temporary table session.temp1 like t_st2006 on commit preserve rows not logged in usertemp1; declare myCursor1 cursor for select char(g33a,4), sum(g46) from t_st2006 where g01a='ЭК' and g54d between '2006-01-01' and '2006-12-31' group by char(g33a,4); declare myCursor cursor with return for select * from session.temp1; select sum(g46) into vr_summa from t_st2006 where g01a='ЭК' and g54d between '2006-01-0' and '2006-12-31'; open myCursor1; while sqlcode=000 do fetch myCursor1 into vr_g33a, vr_sum; if vr_sum>=vr_summa then insert into session.temp1 select * from t_st2006 where char(g33a, 4)=vr_g33a and g54d between '2006-01-0' and '2006-12-31'; end if; end while; close myCursor1; open myCursor; end@ Вроди все ОК, но процессор командной строки ругается на: SQL0104N Обнаружен неправильный элемент "<cursor declaration>" после текста "". Список правильных элементов: "<SQL statement>". LINE NUMBER=9. SQLSTATE=42601 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2007, 08:01 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
Нельзя объвлять сначала временные таблицы, а потом курсор. Есть правила в порядке объявления... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2007, 11:50 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
TORTНельзя объвлять сначала временные таблицы, а потом курсор. Есть правила в порядке объявления... Какова порядок объявления? Если вставить объявление временной таблицы после курсора коммандная строка ругается на: SQL0204N Имя "SESSION.TEMP1" не было определено. LINE NUMBER=9 SQLSTATE=42704 create procedure myTemp() result set 1 language sql begin declare vr_sum decimal(15,2); declare vr_g33a char(4); declare vr_summa decimal(15,2); declare myCursor1 cursor for select char(g33a,4), sum(g46) from t_st2006 where g01a='ЭК' and g54d between '2006-01-01' and '2006-12-31' group by char(g33a,4); declare myCursor cursor with return for select * from session.temp1; declare global temporary table session.temp1 like t_st2006 on commit preserve rows not logged in usertemp1; select sum(g46) into vr_summa from t_st2006 where g01a='ЭК' and g54d between '2006-01-0' and '2006-12-31'; open myCursor1; while sqlcode=000 do fetch myCursor1 into vr_g33a, vr_sum; if vr_sum>=vr_summa then insert into session.temp1 select * from t_st2006 where char(g33a, 4)=vr_g33a and g54d between '2006-01-0' and '2006-12-31'; end if; end while; close myCursor1; open myCursor; end@ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2007, 07:26 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
Я динамически делал: declare c1 cursor for s1; set SQL_CMD = "SELECT FIELD1 FROM SESSION.MYTABLE"; PREPARE s1 from SQL_CMD; open c1; ....................... вот что-то вроде этого ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2007, 09:38 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
TORTЯ динамически делал: declare c1 cursor for s1; set SQL_CMD = "SELECT FIELD1 FROM SESSION.MYTABLE"; PREPARE s1 from SQL_CMD; open c1; ....................... вот что-то вроде этого Спасибо за совет кажется все работает ОК!!!. Процедура откомпилировался успешно но при вызове статус возврата = 0; Для проверки создал в БД настоящую таблицу temp1. Вызвал процедуру но результат не вышел на экран. Посмотрел в БД таблица temp1 заполнена данными. В чем же причина? Вроде бы курсор открыт для выводы результата. Вот скрипт: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2007, 08:19 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
Забыл еще один вопрос задать. Как использовать sqlcode для цикла вместо счетчика что бы после окончание строк в курсоре, цикл завершилась. Sqlcode является ключевым словом или ее где то надо объявить? Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2007, 08:52 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
Насчет курсора: declare c1 cursor with return for..... про опции курсора в доке почитайте.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2007, 09:27 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
declare SQLSTATE char(5); declare SQLCODE integer; в начале процедуры вполне достаточно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2007, 09:28 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
Don VinNiЗабыл еще один вопрос задать. Как использовать sqlcode для цикла вместо счетчика что бы после окончание строк в курсоре, цикл завершилась. Sqlcode является ключевым словом или ее где то надо объявить? 1. С курсорами обычно работают так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 2. Если хотите использовать временные таблицы "статически" в курсорах, то перед созданием процедуры в этой же сессии задекларируйте эту временную таблицу. Компилятору нужны метаданные временной таблицы для компиляции. P.S.: А вообще в вашем случае можно одним insert ... select обойтись и не городить циклов, курсоров - быстрее работать будет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2007, 16:50 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein Don VinNiЗабыл еще один вопрос задать. Как использовать sqlcode для цикла вместо счетчика что бы после окончание строк в курсоре, цикл завершилась. Sqlcode является ключевым словом или ее где то надо объявить? 1. С курсорами обычно работают так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 2. Если хотите использовать временные таблицы "статически" в курсорах, то перед созданием процедуры в этой же сессии задекларируйте эту временную таблицу. Компилятору нужны метаданные временной таблицы для компиляции. P.S.: А вообще в вашем случае можно одним insert ... select обойтись и не городить циклов, курсоров - быстрее работать будет... create procedure myTemp() result set 1 language sql begin declare vr_sum decimal(15,2); declare vr_g33a char(4); declare vr_summa decimal(15,2); declare vr_count smallint; declare SQL_CMD varchar(100); declare myCursor1 cursor for select char(g33a,4), sum(g46) from t_st2006 where g01a='ЭК' and g54d between '2006-01-01' and '2006-12-31' group by char(g33a,4); declare myCursor cursor with return for s1; declare global temporary table session.temp1 like t_st2006 on commit preserve rows not logged in usertemp1; set SQL_CMD='select * from session.temp1'; prepare s1 from SQL_CMD; select count(distinct char(g33a,4)) into vr_count from t_st2006 where char(g33a,4)=any(select char(g33a,4) from t_st2006 where g01a='ЭК' and g54d between '2006-01-01' and '2006-12-31' group by char(g33a,4)); select sum(g46) into vr_summa from t_st2006 where g01a='ЭК' and g54d between '2006-01-01' and '2006-12-31'; open myCursor1; while vr_count<>0 do set vr_count=vr_count-1; fetch myCursor1 into vr_g33a, vr_sum; if vr_sum>=vr_summa then insert into session.temp1 select * from t_st2006 where char(g33a, 4)=vr_g33a and g54d between '2006-01-01' and '2006-12-31' and g01a='ЭК '; end if; end while; close myCursor1; open myCursor; end@ Объявил временную таблицу. Откомпелировалься нормально. Вызвал процедуру call myTemp Но результат пустой. Попробывал с обичным таблицой она запольняется и показывает результат работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2007, 08:36 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
С курсорами обычно работают так: Код: plaintext 1. Про CONTINUE HANDLER где можно узнать подробнее. В основном использую для справки SQL 8.2 Referance vol 2, но ненашел про CONTINUE HANDLER ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2007, 08:49 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
Don VinNi С курсорами обычно работают так: Код: plaintext 1. Про CONTINUE HANDLER где можно узнать подробнее. В основном использую для справки SQL 8.2 Referance vol 2, но ненашел про CONTINUE HANDLER Вопрос про CONTINUE HANDLER отподает! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.01.2007, 12:16 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
Тебе же сказали как работать с курсорами, оператор if vr_sum>=vr_summa then insert into session.temp1 select * from t_st2006 where char(g33a, 4)=vr_g33a and g54d between '2006-01-0' and '2006-12-31'; end if; поменяет sqlcode! Обрати внимание Mark Barinstein SET at_end=0; FETCH c1 INTO ...; WHILE (at_end=0) DO ... SET at_end=0; FETCH c1 INTO ...; END WHILE; операторы Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2007, 09:37 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
golsaif vr_sum>=vr_summa then insert into session.temp1 select * from t_st2006 where char(g33a, 4)=vr_g33a and g54d between '2006-01-0' and '2006-12-31'; end if; поменяет sqlcode! sqlcode поменяется только в случае, если этот оператор вызовет ошибку. Если этот insert select ничего не вставит, поменяется sqlstate (на '02000'), а не sqlcode. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2007, 10:34 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
Спасибо всем за помощь! Тема закрыто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2007, 14:08 |
|
||
|
Помогите Temporary table и cursor
|
|||
|---|---|---|---|
|
#18+
Вот, нашёл на просторах интернета ещё способ: CREATE PROCEDURE FETCH_CS01_TEST_RESULTS_PRCXYZ() RESULT SETS 1 LANGUAGE SQL P1 : BEGIN DECLARE GLOBAL TEMPORARY TABLE XYZ( ID INTEGER); P2 : BEGIN DECLARE c1 CURSOR WITH RETURN FOR SELECT ID FROM SESSION.XYZ ; OPEN c1; END P2; END P1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.11.2009, 15:05 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=34236455&tid=1603016]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 14ms |
| total: | 276ms |

| 0 / 0 |
