powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SET NOCOUNT ON для DB2
21 сообщений из 21, страница 1 из 1
SET NOCOUNT ON для DB2
    #39170053
ProfSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переношу приложение с MS SQL на DB2

Пытаюсь в BIRT (The Business Intelligence and Reporting Tools) заполнить Dataset запросом содержащим в себе создание временной таблицы и переноса в нее малой часть данных их длинной таблицы (почти 100 миллионов записей). Dataset не заполняется в Datebase.net запрос отрабатывает. Из опыта работы с MS SQL для того чтобы композитный запрос сработал и вернул данные например в ADODB (VB) в начале должна стоять команда "SET NOCOUNT ON" есть ли в DB2 аналог? Ибо на "SET NOCOUNT ON" он дает ошибку.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39171429
knudsen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ProfSD,

Это, случайно не DB2OPTIONS {+/-}m ?

Но мне кажется проблема не в этом.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39171446
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ProfSD,

Покажите, как вы в своем композитном запросе создаете (в точности) и заполняете (можно схематично) временную таблицу.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39171530
PSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переношу приложение на другую базу данных.
Мне нужно перенести с MS SQL на DB2 запрос следующего вида:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
set nocount on 

DECLARE GLOBAL TEMPORARY TABLE SESSION.temptable (	
WONUM VARGRAPHIC(10) NOT NULL, 
STATUS VARGRAPHIC(16) NOT NULL, 	
CHANGEDATE TIMESTAMP NOT NULL	) WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED; 

INSERT INTO SESSION.temptable  ( 	WONUM ,  	STATUS ,  	CHANGEDATE 	) select wonum, STATUS  ,changedate  from maximo.WOSTATUS where parent is not null and status='COMP' and  CHANGEDATE between '2016-01-01'and '2016-02-01';

select * from    SESSION.temptable; /* в продуктиве в этом месте стоит большой запрос который используя отобранызаписи как ключи  выдергивает данные из 3х десятков таблиц и производит вычисление*/ 

drop TABLE SESSION.temptable ;



Кроме всего прочего мне нужно воткнуть этот запрос в Dataset отчета реализованного на BIRT. В существующей версии приложения использовался самописный генератор отчетов на VB6 (MSSQL + VB + ADODB). В нем для того чтобы запросы с временными таблицами нормально отрабатывали запрос должен был начинаться c set nocount on .
Но DB2 эту команду не понимает. А без set nocount on DataSet в BIRT его тоже обрабатывать не хочет , возвращает пустой набор.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39171638
knudsen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PSD,

Может быть BIRT ожидает, что источник MSSQL и не настроен на DB2, поэтому и "требует" SET NOCOUNT ON?
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39171642
knudsen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PSD,

Кстати, а зачем убивать в конце таблицу? - сама должна умереть...
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39171660
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PSD,

И что, вы как-то этому DataSet сообщаете, что данные надо взять из таблицы SESSION.temptable?
Если да, то зачем вы DROP TABLE делаете после INSERT ... SELECT?
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39171685
PSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein, сам drop не влияет в финальной версии он в начале и с условием если таблица есть то убиваем и пересоздаем (и вообще без дропа пробовал ).
А сама она не умрет, отчет запускается на сервере отчетов от имени админа.... там сессия может годами висеть.

Хуже всего что BIRT ошибку не выдает, и ни куда ее не пишет.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39171687
PSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
knudsen, нет настроен он корректно, запросы из одного селекта обрабатываются без проблем.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39171689
PSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein, а разве этого не достаточно:
Код: sql
1.
select * from    SESSION.temptable;
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39171702
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PSDMark Barinstein, а разве этого не достаточно:
Код: sql
1.
select * from    SESSION.temptable;

Я честно, говоря, не знаю, как устроены эти DataSet, но если он внутри себя ожидает, что, вызвав вот этот сложный запрос, он должен получить ResultSet, то он его не получит - в DB2 compound statement не возвращает ResultSet.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39172058
knudsen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PSD,

Если попробовать с регулярной таблицей взамен временной и получится такой же результат, тогда дело не в ней.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39172094
PSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark Barinstein, Попробовал воспроизвести ситуацию на VBA c через ADODB результат аналогичный. Ошибки при обработке запроса не происходит ADODB.Recordset инициализируется но adorec.Fields.Count=0.

Я правильно понял что DB2 в случае если в запросе есть что то еще кроме select возвращает не результирующий набор (из последнего select ), а какую то другую структуру данных? И для того чтобы получить стандартный результирующий набор нужно запускать запросы по очереди внутри одной сессии.


Есть какие то библиотеки которыми можно разобрать такой ответ от сервера, стандартные клиенты например Database.Net такие запросы обрабатывают без проблем и каким то образом получают ResultSet.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39172107
PSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
knudsen, с постоянной таблицей будет такой же результат. Дело не в самой таблице а в том что одним пакетом на сервер уходят 5 последовательных запросов, в этом случае сервер возвращает не чистый набор данных по последнему select а присылает еще какую то служебную информацию по результату отработки первых 4х запросов (вроде как количество затронутых строк и результат выполнения запроса ). Инструмент (
MXReportDataSetImpl ] http://api.gjcq176.com/Javadocs75/Javadocs7500/com/ibm/tivoli/maximo/report/script/MXReportDataSet.html
) через который я оправляю запрос ждет от сервера именно результат работы Select, насколько я понимаю в результате он хватает ответ по первому запросу и так как это не набор строк (но при этом сервер прислал статус успешного выполнения запроса) то эесепшон не генерится но и данных ни каких в отчет не приходит.

В MS SQL проблема решалась SET NOCOUT ON , после чего MS SQL больше не отсылал промежуточные результаты а возвращал только результат последнего селекта в запросе.


Мне нужно аналогичное решение для DB2
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39172138
PSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
knudsen, DB2OPTIONS {+/-}m по описанию очень похожа, но на сколько я понял это команда для командной строки AIX.
А мне нужно отключать вывод отчетов по количеству строк из SQL из SQL Запроса, чтобы результат запроса вида:
"
CREATE TABLE ....
INSERT ....
INSERT ....
SELECT ....
"

Можно было принять в обычный RescordSet (Например ADODB.RescordSet), что бы база не возвращала результаты (чтоб приложение не видело что перед селектом были еще какие то действия ) первых 2х запросов а вернула только результат селекта.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39172234
knudsen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PSD,

А что-нибудь такое пробовали? Или обязательно с промежуточной таблицей?
Код: sql
1.
2.
3.
WITH temptable (WONUM , STATUS, changedate ) AS 	 
(select wonum, STATUS  ,changedate  from maximo.WOSTATUS where parent is not null and status='COMP' and  CHANGEDATE between '2016-01-01'and '2016-02-01')
select * from  temptable; 
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39172250
knudsen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PSD,

Есть такой параметр для DB2OPTION - "o" , если его выставить, то ничего на "экран" выводить не будет или по другому
db2=>
Код: sql
1.
UPDATE COMMAND OPTIONS USING o OFF 
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39172675
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PSDMark Barinstein, Попробовал воспроизвести ситуацию на VBA c через ADODB результат аналогичный. Ошибки при обработке запроса не происходит ADODB.Recordset инициализируется но adorec.Fields.Count=0.

Я правильно понял что DB2 в случае если в запросе есть что то еще кроме select возвращает не результирующий набор (из последнего select ), а какую то другую структуру данных? И для того чтобы получить стандартный результирующий набор нужно запускать запросы по очереди внутри одной сессии.


Есть какие то библиотеки которыми можно разобрать такой ответ от сервера, стандартные клиенты например Database.Net такие запросы обрабатывают без проблем и каким то образом получают ResultSet.
Всё зависит от того, как именно оно воспринимает и выполняет то, что вы написали. В DB2 есть 2 типа запросов - "простые" и "сложные". Простые состоят из одной SQL команды, сложные - из нескольких, разделяемых внутри символом ';' и заключенные в begin atomic ... end или begin atomic ... end.
Никаких структур данных или результирующих наборов сложный запрос не возвращает. Считайте, что вы вызываете хранимую процедуру, которая ничего не возвращает в случае сложного запроса.
Судя по тому, что вы написали, оно у вас воспринимает ваш ввод как 5 простых запросов. Иначе оно не выполнило бы SELECT "в никуда" внутри сложного запроса.
А вот как оно эти запросы обрабатывает и почему не сохраняет результирующий набор, который последний SELECT возвратил - трудно сказать. Надо документацию по этим компонентам читать.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39172906
PSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
knudsenPSD,

А что-нибудь такое пробовали? Или обязательно с промежуточной таблицей?
Код: sql
1.
2.
3.
WITH temptable (WONUM , STATUS, changedate ) AS 	 
(select wonum, STATUS  ,changedate  from maximo.WOSTATUS where parent is not null and status='COMP' and  CHANGEDATE between '2016-01-01'and '2016-02-01')
select * from  temptable; 




Спасибо WITH решил текущую проблему.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39172925
PSD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinPSDMark Barinstein, Попробовал воспроизвести ситуацию на VBA c через ADODB результат аналогичный. Ошибки при обработке запроса не происходит ADODB.Recordset инициализируется но adorec.Fields.Count=0.

Я правильно понял что DB2 в случае если в запросе есть что то еще кроме select возвращает не результирующий набор (из последнего select ), а какую то другую структуру данных? И для того чтобы получить стандартный результирующий набор нужно запускать запросы по очереди внутри одной сессии.


Есть какие то библиотеки которыми можно разобрать такой ответ от сервера, стандартные клиенты например Database.Net такие запросы обрабатывают без проблем и каким то образом получают ResultSet.
Всё зависит от того, как именно оно воспринимает и выполняет то, что вы написали. В DB2 есть 2 типа запросов - "простые" и "сложные". Простые состоят из одной SQL команды, сложные - из нескольких, разделяемых внутри символом ';' и заключенные в begin atomic ... end или begin atomic ... end.
Никаких структур данных или результирующих наборов сложный запрос не возвращает. Считайте, что вы вызываете хранимую процедуру, которая ничего не возвращает в случае сложного запроса.
Судя по тому, что вы написали, оно у вас воспринимает ваш ввод как 5 простых запросов. Иначе оно не выполнило бы SELECT "в никуда" внутри сложного запроса.
А вот как оно эти запросы обрабатывает и почему не сохраняет результирующий набор, который последний SELECT возвратил - трудно сказать. Надо документацию по этим компонентам читать.


Совместно с админам выяснили что в этом компоненте видимо есть какая то предобработка запросов.
Оказалось что запросы содержащие "CREATE .... " и "INSERT ..." как по отдельности так в "сложном" запросе в принципе не доходят до базы, как и запросы с ";" .
А мне еще казалось что то как быстро все отрабатывает, например в Database.net если запрос с ошибкой, ошибка выскакивает гораздо дольше.

При этом в англоязычном сообществе разработчиков BIRT есть топики по отчетам изменяющим данные. И вроде как пишут что это возможно, но к сожалению без конкретики какой пакет они используют и исходного кода (или просто я его не вижу так как доступ не платный). Видимо так как это пакет производимый IBM для своей платформы IBM MAXIMO и возможно там CREATE .... " , "INSERT ..." и "UPDATE..." принципиально зарезаны из соображений безопастности или увеличения продаж лицензий на основной продукт. Типа смотреть пожалуйста просмотр отчетов не требующий доплицензий, а если хочешь менять то стандартная лицензия и кастомизация приложения.
...
Рейтинг: 0 / 0
SET NOCOUNT ON для DB2
    #39184608
SpongeBobFan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мы используем хранимые процедуры в подобной ситуации. Т.е. в отчете просто вызывается процедура, которая возвращает result set. А вся логика с временными таблицами и кучей запросов в этой процедуре.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SET NOCOUNT ON для DB2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]