Опять функцци Оракла...

По каким-то неизвестным мне причинам, вызов функции в синтаксисе SELECT оракл воспринимать не хочет:
(ADODataset)

SELECT isn.nchr_crm.add_contragent(:pin_opf,:pin_name,:pin_org_name,:pin_inn,:pin_categ,:pin_site,:pin_kontr_type) AS IDSys FROM DUAL

А может выполниться только так:
(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;

Как в CRM-е получить значение IDSys?

Нравится

13 комментариев

Кроме того, похоже, что оракловское присвоение := воспринимается как параметр и вылезает ошибка:

TSADOEngineLibrary.ADOCommand: Неправильно определен объект Parameter. Предоставлены несовместимые или неполные сведения

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, даже средствами Оракла.

а какую ошибку выдает Oracle?

В CRM оракл вообще ошибок не выдавал. CRM просто зависала.

"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

Спасибо за ответ, но получается, что он мне не поможет - у меня версия 3.0.2.244.:sad:

Тогда вам необходимо использовать ADO Dataset и выбирать данные из хранимой функции. Но ее придется написать так, чтобы никакие данные она не модифицировала. А необходимые данные перед этим модифицировать другой ADO Command. Например так.

Уже решили этот вопрос. Функция модифицирует данные и возвращает идентификатор. Только вот как они это сделали я не знаю.

Показать все комментарии