Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SET NOCOUNT ON для DB2 / 21 сообщений из 21, страница 1 из 1
12.02.2016, 23:48
    #39170053
ProfSD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET NOCOUNT ON для DB2
Переношу приложение с 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
15.02.2016, 15:23
    #39171429
knudsen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET NOCOUNT ON для DB2
ProfSD,

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

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

Покажите, как вы в своем композитном запросе создаете (в точности) и заполняете (можно схематично) временную таблицу.
...
Рейтинг: 0 / 0
15.02.2016, 16:36
    #39171530
PSD
PSD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET NOCOUNT ON для DB2
Переношу приложение на другую базу данных.
Мне нужно перенести с 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
15.02.2016, 17:51
    #39171638
knudsen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET NOCOUNT ON для DB2
PSD,

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

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

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

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

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

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

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


Есть какие то библиотеки которыми можно разобрать такой ответ от сервера, стандартные клиенты например Database.Net такие запросы обрабатывают без проблем и каким то образом получают ResultSet.
...
Рейтинг: 0 / 0
16.02.2016, 11:48
    #39172107
PSD
PSD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET NOCOUNT ON для DB2
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
16.02.2016, 12:16
    #39172138
PSD
PSD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET NOCOUNT ON для DB2
knudsen, DB2OPTIONS {+/-}m по описанию очень похожа, но на сколько я понял это команда для командной строки AIX.
А мне нужно отключать вывод отчетов по количеству строк из SQL из SQL Запроса, чтобы результат запроса вида:
"
CREATE TABLE ....
INSERT ....
INSERT ....
SELECT ....
"

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

Есть такой параметр для DB2OPTION - "o" , если его выставить, то ничего на "экран" выводить не будет или по другому
db2=>
Код: sql
1.
UPDATE COMMAND OPTIONS USING o OFF 
...
Рейтинг: 0 / 0
16.02.2016, 22:16
    #39172675
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET NOCOUNT ON для DB2
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
17.02.2016, 10:44
    #39172906
PSD
PSD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET NOCOUNT ON для DB2
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
17.02.2016, 11:02
    #39172925
PSD
PSD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET NOCOUNT ON для DB2
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
03.03.2016, 11:39
    #39184608
SpongeBobFan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET NOCOUNT ON для DB2
Мы используем хранимые процедуры в подобной ситуации. Т.е. в отчете просто вызывается процедура, которая возвращает result set. А вся логика с временными таблицами и кучей запросов в этой процедуре.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SET NOCOUNT ON для DB2 / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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