|
|
|
[ASA 9.0.0.1321] Проблема с возвратом набора из ХП без указания его полей
|
|||
|---|---|---|---|
|
#18+
Создана ХП без раздела RESULT. ХП возвращает в зависимости от параметров наборы с различным количеством полей. Первый вызов происходит нормально, второй и последующие (с другими значениями параметров) ругается на отсутствие полей из предыдущего вызова . Т.е. пишет "Column 'CCC' not found", где 'CCC' - поле из предыдущего вызова. В ХП: объявляется временная локальная таблица, динамическим курсором в нее запихиваются данные, в конце делается SELECT * FROM <временная таблица>. Если это имеет значение, то в теле ХП используется Execute Immediate, разумеется. Проблема возникает как в Sybase Central, так и в проге на Дельфи, которая работает через ODBC. Как лечится? P.S. Как показатель правильности работы процедуры работает следующий код (в I-SQL Sybase Central): Код: plaintext 1. 2. Отрабатывается нормально с разными значениями параметров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2004, 10:49 |
|
||
|
[ASA 9.0.0.1321] Проблема с возвратом набора из ХП без указания его полей
|
|||
|---|---|---|---|
|
#18+
Может я не все понимаю, но если входящие параметры процедуры запихнуть в таблицу, для этого пользователя, а потом процедуру вызвать без параметров, то правильный результат получится? Или так нельзя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2004, 11:20 |
|
||
|
[ASA 9.0.0.1321] Проблема с возвратом набора из ХП без указания его полей
|
|||
|---|---|---|---|
|
#18+
Попробуйте в ХП вызывать EXECUTE IMMEDIATE с параметром WITH RESULT SET ON, может быть поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2004, 11:21 |
|
||
|
[ASA 9.0.0.1321] Проблема с возвратом набора из ХП без указания его полей
|
|||
|---|---|---|---|
|
#18+
BonartСоздана ХП без раздела RESULT. ХП возвращает в зависимости от параметров наборы с различным количеством полей. Первый вызов происходит нормально, второй и последующие (с другими значениями параметров) ругается на отсутствие полей из предыдущего вызова . Использую такую схему очень часто (еще со времен ASA7) и никаких проблем не возникало. Где-то у вас что-то не то.... Вот пример одной из моих процедур: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Код: plaintext 1. 2. Очень сильно подозреваю, что ошибка возникает когда вызов multi-resultset процедуры делается из другой процедуры? Там может начаться конфликт из-за того, что в первый запуск процедуры делается ее компиляция и откомпилировання процедура кладется в кеш, на повторном запуске соотвественно возникает проблема толи взять процедуру из кеша, толи откомпилировать ее заново... В качестве лечения предлагаю делать вызовы процедуры не через простой call а через execute immediate 'call my_super_sp(1)'; Может помочь разнести повторные вызовы процедуры по разным транзакциям, или даже по разным коннектам к базе. У меня эти процедуры вызываются из PowerBuilder через ODBC со всеми стандартными настройками. Просто в композитном DW лежат несколько дочерних DW с простыми вызовами процедуры с разными параметрами. В Delphi я их вызываю через SaVCL, тоже проблем не возникало. Оба режима работы с транзакциями без малейших проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2004, 18:51 |
|
||
|
[ASA 9.0.0.1321] Проблема с возвратом набора из ХП без указания его полей
|
|||
|---|---|---|---|
|
#18+
Ничего не помогло. Такое ощущение, что список полей результата где-то хитро кэшируется, потом вызывается из кэша, несмотря на то, что это нафиг не нужно. В документации на это косвенно указывается фразой: "Если не используется возможность возвращения различных результирующих наборов, по соображениям производительности следует включить раздел RESULT." Еще дока упоминает оператор DESCRIBE, но я что-то не понял зачем он нужен, да и ругается на него тот же Sybase Central - синтаксическая ошибка. Если кто объяснит на пальцах - буду благодарен. White Owl BonartСоздана ХП без раздела RESULT. ХП возвращает в зависимости от параметров наборы с различным количеством полей. Первый вызов происходит нормально, второй и последующие (с другими значениями параметров) ругается на отсутствие полей из предыдущего вызова . Использую такую схему очень часто (еще со времен ASA7) и никаких проблем не возникало. Где-то у вас что-то не то.... Вот и я хотел бы понять где у меня что-то не то. Ок, приведу свою процедуру: Код: plaintext 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. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. В итоге, в зависимости от дат и кванта получаются таблицы вида: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. В ХП: объявляется временная локальная таблица, динамическим курсором в нее запихиваются данные, в конце делается SELECT * FROM <временная таблица>. Если это имеет значение, то в теле ХП используется Execute Immediate, разумеется. Это все не важно, формировать резалт-сэт можно как угодно. Впрочем, я не уверен насчет execute immediate. Оно может и хулиганить в этой ситуации, я сам эту конструкцию не использую почти никогда. Отладчик в Sybase Central не ругается, ни на одну строчку. Ошибка выдается уже после End; процедуры. Есть еще один момент: "нормальные" процедуры (у которых есть RESULT) я вызываю не CALL'ом, а Код: plaintext Очень сильно подозреваю, что ошибка возникает когда вызов multi-resultset процедуры делается из другой процедуры? Нет. RepDyn вызывается в "чистом виде", т.е. либо call RepDyn в Sybase Central или в компоненте TQuery , либо методом Execute компонента TStoredProc . Там может начаться конфликт из-за того, что в первый запуск процедуры делается ее компиляция и откомпилировання процедура кладется в кеш, на повторном запуске соотвественно возникает проблема толи взять процедуру из кеша, толи откомпилировать ее заново... У меня была та же мысль, только процедура-то запускается с нуля. В качестве лечения предлагаю делать вызовы процедуры не через простой call а через execute immediate 'call my_super_sp(1)'; Может помочь разнести повторные вызовы процедуры по разным транзакциям, или даже по разным коннектам к базе. Не работает. Пишет "Result set not permitted in RepDyn". У меня эти процедуры вызываются из PowerBuilder через ODBC со всеми стандартными настройками. Просто в композитном DW лежат несколько дочерних DW с простыми вызовами процедуры с разными параметрами. В Delphi я их вызываю через SaVCL, тоже проблем не возникало. Оба режима работы с транзакциями без малейших проблем. Что такое DW? Что такое SaVCL? Если библиотека, то где взять можно? PowerBuilder'ом не пользуюсь... Без перечисленного можно обойтись? Чайник я в общем... P.S. если всю эту ботву генерить в дельфийском коде (компонент SQLScript), то все работает, просто хочется побольше в сервер упихать, поменьше дельфи кодом засорять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2004, 13:19 |
|
||
|
[ASA 9.0.0.1321] Проблема с возвратом набора из ХП без указания его полей
|
|||
|---|---|---|---|
|
#18+
У меня была похожая ситуация. Скорее всего при первом вызове процедура компилируется и запоминает структуру временной таблицы. При повторном вызове - выполняется уже откомпилированный код процедуры со старой структурой. Я перед скриптом создания временной таблицы выполняю Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2004, 14:50 |
|
||
|
[ASA 9.0.0.1321] Проблема с возвратом набора из ХП без указания его полей
|
|||
|---|---|---|---|
|
#18+
2 VadimS Не помогло. Я думаю, если бы было так как ты сказал - была бы ругань уже в районе Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2004, 17:10 |
|
||
|
[ASA 9.0.0.1321] Проблема с возвратом набора из ХП без указания его полей
|
|||
|---|---|---|---|
|
#18+
Bonart_Такое ощущение, что список полей результата где-то хитро кэшируется, потом вызывается из кэша, несмотря на то, что это нафиг не нужно. Да, кешируется. Я же говорю - процедура при первом старте компилируется и для нее формируется вспомогательный RESULT(f1, f2,etc); Bonart_Еще дока упоминает оператор DESCRIBE, но я что-то не понял зачем он нужен, да и ругается на него тот же Sybase Central - синтаксическая ошибка. Это оператор из Embedded SQL. Можешь пока не обращать на него внимания. Код: plaintext 1. 2. 3. Функция Execute() очень сложна для оптимизатора и ее лучше использовать как можно реже. Bonart_ Отладчик в Sybase Central не ругается, ни на одну строчку. Ошибка выдается уже после End; процедуры. Ошибка выдается на "select *" потому что оно было оптимизировано и положено в кеш. Да, в теории оно все должно работать так как написано. Но оптимизатор не правильно кеширует результаты execute() c последующим select *. Сделай несколько временных таблиц с жестко заданной структурой, и делай выборку из них. Проблема исчезнет 100%. Bonart_У меня была та же мысль, только процедура-то запускается с нуля. Ха! "С нуля" процедура запускается только один раз - после старта сервера. После этого кеш всегда вмешивается. Bonart_Что такое DW? DataWindow - это... помесь TQuery, TDataGrid и все отчетные библиотеки вместе взятые :) Короче это то, через что PB делает запросы к базе и показывает результаты запроса. Bonart_Что такое SaVCL? Если библиотека, то где взять можно? Библиотека для Borland`овских языковых систем. savcl.narod.ru Читайте местный FAQ там все написано. Bonart_Без перечисленного можно обойтись? Конечно можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2004, 19:45 |
|
||
|
[ASA 9.0.0.1321] Проблема с возвратом набора из ХП без указания его полей
|
|||
|---|---|---|---|
|
#18+
White Owl Bonart_Такое ощущение, что список полей результата где-то хитро кэшируется, потом вызывается из кэша, несмотря на то, что это нафиг не нужно. Да, кешируется. Я же говорю - процедура при первом старте компилируется и для нее формируется вспомогательный RESULT(f1, f2,etc); Хм. Тогда глупый вопрос: в чем тогда профит возможности возвращать different result sets?... Код: plaintext 1. 2. 3. Функция Execute() очень сложна для оптимизатора и ее лучше использовать как можно реже. Bonart_ Отладчик в Sybase Central не ругается, ни на одну строчку. Ошибка выдается уже после End; процедуры. Ошибка выдается на "select *" потому что оно было оптимизировано и положено в кеш. Да, в теории оно все должно работать так как написано. Но оптимизатор не правильно кеширует результаты execute() c последующим select *. Сделай несколько временных таблиц с жестко заданной структурой, и делай выборку из них. Проблема исчезнет 100%. Да я бы с удовольствием, однако исходя из поставленной задачи: количество столбцов заранее неизвестно в принципе, равно как и их названия. В общем и целом они могут быть любыми (и имена столбцов и их количество). Bonart_У меня была та же мысль, только процедура-то запускается с нуля. Ха! "С нуля" процедура запускается только один раз - после старта сервера. После этого кеш всегда вмешивается. Ну я имел ввиду, что не из другой процедуры. А этим кэшем как-нибудь можно управлять интерактивно? Bonart_Что такое DW? DataWindow - это... помесь TQuery, TDataGrid и все отчетные библиотеки вместе взятые :) Короче это то, через что PB делает запросы к базе и показывает результаты запроса. Bonart_Что такое SaVCL? Если библиотека, то где взять можно? Библиотека для Borland`овских языковых систем. savcl.narod.ru Читайте местный FAQ там все написано. Эээ... ткни, плиз, носом, где в FAQ'е об этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2004, 22:48 |
|
||
|
[ASA 9.0.0.1321] Проблема с возвратом набора из ХП без указания его полей
|
|||
|---|---|---|---|
|
#18+
Bonart_Хм. Тогда глупый вопрос: в чем тогда профит возможности возвращать different result sets?... Ну как это в чем? В том, что можно держать всю логику в одной процедуре. У меня почти все многосекционные отчеты так сделаны. Лучше объявляй десяток разных временных таблиц с жестко заданной структурой в таблицах. Да я бы с удовольствием, однако исходя из поставленной задачи: количество столбцов заранее неизвестно в принципе, равно как и их названия. В общем и целом они могут быть любыми (и имена столбцов и их количество). Ну вообще-то, это не совсем задача для БД. Это скорее клиенту пристало кросс-табы рисовать.... А попробуй имена темп-таблиц тоже менять? Раз уж ты так сильно хочешь строить временную таблицу в рантайме, то сделай ей и имя еще переменным. Может заработать. Хотя я бы, все же, переложил бы задачу построенния шахматки на клиента. Сервер может выдавать уже готовые цифры, а клиент только чтоб форматировал результат. А этим кэшем как-нибудь можно управлять интерактивно? Насколько я знаю - нет. Эээ... ткни, плиз, носом, где в FAQ'е об этом. http://www.sql.ru/faq/faq_topic.aspx?fid=184 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2004, 00:27 |
|
||
|
[ASA 9.0.0.1321] Проблема с возвратом набора из ХП без указания его полей
|
|||
|---|---|---|---|
|
#18+
White Owl Bonart_Хм. Тогда глупый вопрос: в чем тогда профит возможности возвращать different result sets?... Ну как это в чем? В том, что можно держать всю логику в одной процедуре. У меня почти все многосекционные отчеты так сделаны. Да, но если это не работает? Впрочем, это уже лирика, фиг с ней. White Owl Bonart White OwlЛучше объявляй десяток разных временных таблиц с жестко заданной структурой в таблицах. Да я бы с удовольствием, однако исходя из поставленной задачи: количество столбцов заранее неизвестно в принципе, равно как и их названия. В общем и целом они могут быть любыми (и имена столбцов и их количество). Ну вообще-то, это не совсем задача для БД. Это скорее клиенту пристало кросс-табы рисовать.... А попробуй имена темп-таблиц тоже менять? Раз уж ты так сильно хочешь строить временную таблицу в рантайме, то сделай ей и имя еще переменным. Может заработать. Т.е. снова execute использовать? Что-то не сработало - выдает непонятное "Result set not permitted in `<batch statement>`". Хотя я бы, все же, переложил бы задачу построенния шахматки на клиента. Сервер может выдавать уже готовые цифры, а клиент только чтоб форматировал результат. На клиент неинтересно, особенно учитывая, что гриды автоматически поля генерят. Ну а так проще, имхо, все в код упихать, как сейчас. Эээ... ткни, плиз, носом, где в FAQ'е об этом. http://www.sql.ru/faq/faq_topic.aspx?fid=184 Сэнькс, проглядел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2004, 15:57 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=32712618&tid=2014189]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
59ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 254ms |
| total: | 408ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...