Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Вызов хранимок DB2 в MS SQL через провайдеры DB2OLEDB и MSDASQL  [new]
medoed
Member

Откуда:
Сообщений: 944
Приветствую!

Не поддерживается вызов хранимок DB2 в MS SQL через провайдеры DB2OLEDB и MSDASQL.

Простой вызов SP: The OLE DB provider "DB2OLEDB" for linked server "spddatservvDATT3" indicates that either the object has no columns or the current user does not have permissions on that object.
Со вставкой в темповую таблицу: The requested operation could not be performed because OLE DB provider "DB2OLEDB" for linked server "spddatservvDAT3" does not support the required transaction interface.

Процедура возвращает, что то:

                     
     SET STR_EXEC = 'select    
     NAME       as NAME         ,
     coalesce(START_COUN,0)       as  START_COUN    ,
     ,ID_FINTOOL
     from SESSION.TTT';
     PREPARE s1 FROM  STR_EXEC ; 
     OPEN    c1;


Как быть? Проблем с функцией возвращающих таблицу нет! В функции полную динамику повторить скорее всего не смогу...
28 окт 13, 11:02    [15039980]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимок DB2 в MS SQL через провайдеры DB2OLEDB и MSDASQL  [new]
medoed
Member

Откуда:
Сообщений: 944
И так пытаюсь удаленно запустить процедуру DB2, возвращающую курсор удаленно на SQL2012

Покопался - так работает:
EXEC('CALL WEB.TEST_DATA') at spddatservv

А вот с любым параметром нет:
EXEC('CALL WEB.TEST_DATA_I ( 11499 )')  at spddatservv

И так не работает:
EXEC('CALL WEB.TEST_DATA_I (id=>11499 )')  at spddatservv


Пишет, что доступа нет
OLE DB provider "DB2OLEDB" for linked server "spddatservv" returned message "Routine "" (specific name "") is implemented with code in library or path "", function "" which cannot be accessed. Reason code: "". SQLSTATE: 42724, SQLCODE: -444".


Может кто сталкивался с таковой проблемой. Монстры DB2, может подскажите куда копать?
29 окт 13, 10:44    [15045103]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимок DB2 в MS SQL через провайдеры DB2OLEDB и MSDASQL  [new]
medoed
Member

Откуда:
Сообщений: 944
Сам разобрался:

CREATE OR REPLACE PROCEDURE WEB.TEST_DATA_K ( ID_ INT)
  DYNAMIC RESULT SETS 1
  LANGUAGE SQL
  NOT DETERMINISTIC
  EXTERNAL ACTION
  MODIFIES SQL DATA
  INHERIT SPECIAL REGISTERS
begin
    DECLARE STR_EXEC   VARCHAR(32000);
    declare c1 cursor with return for s1;
    set STR_EXEC =   'select * from FORM.BANKK where ID_PERSON = ' || CAST(ID_ as varchar(10)) ;
    PREPARE s1 FROM  STR_EXEC ; 
    OPEN    c1;
end;

-- call  WEB.TEST_DATA_K (11499) так вызывать на db2


А вот так на SQL:
EXEC('call  WEB.TEST_DATA_K (?)',11499)  at spddatservv
29 окт 13, 11:56    [15045605]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимок DB2 в MS SQL через провайдеры DB2OLEDB и MSDASQL  [new]
medoed
Member

Откуда:
Сообщений: 944
medoed,

Там с датами в параметрах , гемор ещё тот , может кому пригодится:

-- на DB2 так
call WEB.VOL_KOT_15012(41119,1,'2013-01-01', '2013-02-01', '0001-01-01');


Для того, чтобы вызвать на SQL сервере - примерно так:
declare @par1 varchar(12) =  convert(varchar(12),CAST('2013-01-01' as DATE),104)
declare @par2 varchar(12) =  convert(varchar(12),CAST('2013-02-01' as DATE),104)
declare @par3 varchar(12) =  convert(varchar(12),CAST('1900-01-01' as DATE),104)

EXEC('call WEB.VOL_KOT_15012(?,?,?,?,?)', 41119,1,@par1,@par2,@par3) at spddat3
29 окт 13, 12:27    [15045801]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимок DB2 в MS SQL через провайдеры DB2OLEDB и MSDASQL  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
medoed,

Пытаюсь вызвать хранимую процедуру iSeries 5.04 в SSRS 2008R2, она исполняется, но не показывает SSRS свои колонки.
Вразумительных ответов пока ни от кого получить не смог.

Вот что я пробовал:

на SSRS в датасете используется Provider=IBMDASQL
вызов процедуры CALL TESTDAT.REPORT(?)

на iSeries текст тестовой процедуры (она зовет табличную функцию):
CREATE PROCEDURE TESTDAT.REPORT (IN STRT DATE)
DYNAMIC RESULT SETS 1
LANGUAGE SQL READS SQL DATA
BEGIN
	DECLARE CSR1 CURSOR WITH RETURN FOR
	SELECT * FROM
	TABLE(TESTDAT.DATESDEP(STRT)) AS DD;

	OPEN CSR1;
	RETURN;
END

Использовать PREPARE ... FROM ... вроде бы невозможно, потому что текст запроса очень большой - 16кб.
Интересно, что из этой же самой процедуры данные возвращаются через клиент SquirrelSql с драйвером JTOpen(AS/400).

Что посоветуете? Нужно ли устанавливать OLE DB Provider для DB2? Протестировать пока не могу - лаптоп дали только с Standard Edition.
30 окт 13, 22:23    [15055784]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимок DB2 в MS SQL через провайдеры DB2OLEDB и MSDASQL  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Да, вот еще - через SquirrelSql вызов процедуры осуществляется выражением

CALL TESTDAT.CMSREPORT (DATE('10/23/2013'))

и так работает. А про SSRS я выше слегка напутал - процедура исполняется, но не возвращает данных, если в качестве источника данных задать Stored Procedure и выбрать ее название, а через CALL не выполняется.
30 окт 13, 22:26    [15055798]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимок DB2 в MS SQL через провайдеры DB2OLEDB и MSDASQL  [new]
medoed
Member

Откуда:
Сообщений: 944
Gobzo Kobler
medoed,

Пытаюсь вызвать хранимую процедуру iSeries 5.04 в SSRS 2008R2, она исполняется, но не показывает SSRS свои колонки.
Вразумительных ответов пока ни от кого получить не смог.

Вот что я пробовал:

на SSRS в датасете используется Provider=IBMDASQL
вызов процедуры CALL TESTDAT.REPORT(?)

на iSeries текст тестовой процедуры (она зовет табличную функцию):
[src]
Что посоветуете? Нужно ли устанавливать OLE DB Provider для DB2? Протестировать пока не могу - лаптоп дали только с Standard Edition.

У меня под windows и DB2-9.0 и MSSQL-2012. Драйвер нужен, OleDb вроде имеет минимальное количество глюков, см. картинку прилинкованного сервера DB2.

К сообщению приложен файл. Размер - 72Kb
31 окт 13, 15:50    [15059350]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимок DB2 в MS SQL через провайдеры DB2OLEDB и MSDASQL  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
medoed,

Вот что у меня пока получилось:

1. Добавляем в файл C:\Program Files\Microsoft Visual Studio 9\Common7\IDE\PrivateAssemblies в секцию Data тэг

<Extension Name="DB2UDB" Type="IBM.Data.DB2.iSeries.iDB2Connection,IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9CDB2EBFB1F93A26"/>


и в секцию Designer тэг

<Extension Name="DB2UDB" Type="Microsoft.ReportingServices.QueryDesigners.GenericQueryDesigner,Microsoft.ReportingServices.QueryDesigners"/>


Это включает провайдер DB2UDB.Net в BI Studio.

2. Создаем новый проект, в нем создаем Shared datasource с этим провайдером, в качестве строки соединения даем IP iSeries и имя базы, пользователя и пароль (если есть).
3. Создаем новый отчет, указав источник из 2 и введя запрос SELECT * FROM sysibm.sysdummy1.
4. Открываем отчет и меняем тип запроса на хранимую процедуру, затем идем в Parameters и руками создаем все параметры (важно: параметры типа Date вбиваются как Text, иначе потом отчет не будет выполняться из-за Conversion error). Сохраняем отчет.
5. Идем обратно в Shared datasource и меняем Credentials на No credentials.
6. Теперь если хранимая процедура имеет Public execute permissions, то наш отчет выполнится. Как правильно настроить credentials я пока не разбирался, но вроде данные в отчет идут и с этим разобраться можно будет позже.
31 окт 13, 18:04    [15060354]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимок DB2 в MS SQL через провайдеры DB2OLEDB и MSDASQL  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Да, вот еще:

При создании параметра слева вбиваем его имя как в процедуре, а справа ставим перед ним же собаку и окружаем квадратрыми скобками, вот так [@paramname]. Даты в default values и в значения вбиваем без кавычек.
31 окт 13, 18:07    [15060370]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимок DB2 в MS SQL через провайдеры DB2OLEDB и MSDASQL  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Решение для credentials оказалось совсем простым: добавление UserID=mgr;Password=mgr; к строке соединения.
31 окт 13, 19:08    [15060678]     Ответить | Цитировать Сообщить модератору
 Re: Вызов хранимок DB2 в MS SQL через провайдеры DB2OLEDB и MSDASQL  [new]
medoed
Member

Откуда:
Сообщений: 944
Рад за вас, что все получилось:-) Я просто не из Visual Studio, а из Managment Studio запускал.
31 окт 13, 21:54    [15061402]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить