По каким-то неизвестным мне причинам, вызов функции в синтаксисе SELECT оракл воспринимать не хочет:
(ADODataset)
А может выполниться только так:
(ADOCommand)
begin IDSys := isn.nchr_crm.add_contragent(:pin_opf,:pin_name,:pin_org_name,:pin_inn,:pin_categ,:pin_site,:pin_kontr_type);
end;
Как в CRM-е получить значение IDSys?
Нравится
SSV, уточните, пожалуйста, что значит "вызов функции в синтаксисе SELECT оракл воспринимать не хочет"? Речь идёт о конфигурации MS SQL, из которой посредством ADODataset посылаются запросы в оракловую базу, или на этот раз имеется в виду оракловая конфигурация? Возникают ли какие-то сообщения? Раньше Вы говорили об использовании в ADODataset запросов типа SELECT sites_pkg.f_add(:pNameSite,:pAddressSite) AS IDBalSys FROM DUAL, которые работали. Мне кажется, особых отличий в синтаксисе нет, скорее дело в самой процедуре или её параметрах.
Конфигурация MS SQL, из которой, посредством ADODataset, посылаются запросы в оракловую базу.
Проблема в процедуре (точнее в функции) оракла - она не может, в силу каких-то оракловских заморочек, выполниться с помощью SELECT sites_pkg.f_add(:pNameSite,:pAddressSite) AS IDBalSys FROM DUAL, даже средствами Оракла.
"SSV" написал:По каким-то неизвестным мне причинам, вызов функции в синтаксисе SELECT оракл воспринимать не хочет
1. Если на функцию есть права на Execute и она не модифицирует никакие данные в процессе выполнения, ее можно использовать в операторе SELECT. Какую ошибку вам выдает Oracle?
"SSV" написал:А может выполниться только так:
(ADOCommand)
declare IDSys number;
begin IDSys := isn.nchr_crm.add_contragent(:pin_opf,:pin_name,:pin_org_name,:pin_inn,:pin_categ,:pin_site,:pin_kontr_type);
end;
Попробуйте операторы присвоения писать так ::=
"SSV" написал:Так в том то и дело, что функция вставляет данные. Да еще и в две разные БД. С ораклом я не работаю, какие он там ошибки выдает я не знаю.
Oracle не позволит вам выбрать результат функции в операторе SELECT, если функция модифицирует данные, т.к. это логически неверно. При попытке Oracle будет выдавать ошибку.
Тогда вам необходимо использовать второй вариант - анонимный PL\SQL блок используя (ADOCommand)
1. Создаете сервис ADO Command, настраиваете соединение с нужным сервером, проверяете соединение
2. Пишете там необходимый вам текст, например
begin "TestSP"(:pUSERID, :pSTATUSS); end;
3. Создаете хранимую процедуру на базе Oracle, допустим первый параметр - входящий второй параметр - исходящий (через который вы можете вернуть то, что вам нужно). Эти параметры должны быть созданы с сервисе ADO Command с указанием соответствующих типов
4. Вызов из JScript:
var sp = Services.GetNewItemByUSI('adocmd_Test'); sp.Parameters.ItemsByName('pUSERID').Value = 'user1'; sp.Parameters.ItemsByName('pSTATUSS').Value = ''; //Указание размера обязательно для выходных параметров sp.Parameters.ItemsByName('pSTATUSS').Size = 200; sp.Execute();
Возврат исходящих параметров в ADO Command реализован в версии 3.3.2
Для возврата идентификатора только что созданной записи почитайте об операции RETURNING сервера Oracle
Тогда вам необходимо использовать ADO Dataset и выбирать данные из хранимой функции. Но ее придется написать так, чтобы никакие данные она не модифицировала. А необходимые данные перед этим модифицировать другой ADO Command. Например так.