|
Вызов процедуры Oracle из 1C | ☑ | ||
---|---|---|---|---|
0
colci1981
20.05.14
✎
16:47
|
Здравствуйте. Помогите разобраться как правильно написать код. Есть процедура PROCEDURE get_doc_for_1c(p_result OUT tcursor)
на Сервере. Надо при помощи ADO получить курсор и дальше с ним работать. Написал так: Connection =новый COMОбъект("ADODB.Connection"); Connection.CursorLocation = 3; Попытка Connection.Open("..."); Command = Новый COMОбъект("ADODB.Command"); Command.ActiveConnection = Connection; Исключение сообщить(ОписаниеОшибки()); КонецПопытки; txtQuery="integration_1c.get_doc_for_1c"; ТекстЗапроса=txtQuery; Command.CommandText=ТекстЗапроса; Command.CommandType = 4; prm1 = Command.CreateParameter("p_result", 201, 2, 1000 , null); Command.Parameters.Append(prm1); Command.Prepared = true; rsCursor=Command.Execute(); Выдает ошибку: {Обработка.ЗагрузкаORACLE.Форма.Форма.Форма(380)}: Ошибка при вызове метода контекста (Execute) rsCursor=Command.Execute(); по причине: Произошла исключительная ситуация (OraOLEDB): ORA-06550: Строка 1, столбец 7: PLS-00306: wrong number or types of arguments in call to 'GET_DOC_FOR_1C' ORA-06550: Строка 1, столбец 7: PL/SQL: Statement ignored |
|||
1
colci1981
20.05.14
✎
17:15
|
Up
|
|||
2
f_vadim
20.05.14
✎
17:20
|
русским по белому написано:
неверное количество или тип передаваемых параметров |
|||
3
colci1981
20.05.14
✎
17:22
|
я это вижу но, что не так в коде как получить курсор?
|
|||
4
mr_K
20.05.14
✎
17:23
|
А нафик это шаманство с параметром? Неужели примитивными типами не обойтись?
|
|||
5
colci1981
20.05.14
✎
17:24
|
у процедуры один параметр выходной тип курсор(результат выборки). как его получить в 1C? Есть пример кода с фозвратом курсора?
|
|||
6
f_vadim
20.05.14
✎
17:32
|
а так?
CreateParameter("p_result", 201, 2, 1000) |
|||
7
colci1981
20.05.14
✎
17:38
|
(6) ничего не изменилось та же самая ошибка
|
|||
8
shuhard
20.05.14
✎
17:53
|
(5) ни как
|
|||
9
colci1981
20.05.14
✎
17:57
|
(8) а функция если будет возвращать курсор, тоже ни как?
|
|||
10
Адский плющ
20.05.14
✎
17:57
|
Вот пример, может поможет
// Константы ADO adCmdStoredProc = 4; adParamInput = 1; adParamOutput = 2; adParamInputOutput = 3; adNumeric = 131; adVarChar = 200; adDBTimeStamp = 135; Connection = Новый COMОбъект ("ADODB.Connection"); Connection.ConnectionString = СтрокаПодключения; Connection.ConnectionTimeout = 15; Connection.CursorLocation= 3; Connection.Open(); Cmd = Новый COMОбъект("ADODB.Command"); Cmd.ActiveConnection = Connection; Cmd.CommandText = ИмяКоманды; Cmd.CommandType = adCmdStoredProc; Cmd.Parameters.Append(Cmd.CreateParameter("RN", adNumeric, adParamInputOutput, 19, NULL)); Cmd.Parameters.Append(Cmd.CreateParameter("AGN", adVarChar, adParamInput, 20, код)); Попытка RecordSet = cmd.Execute(); Объект.RN = Cmd.Parameters(0).Value; // номер параметра зависит от порядка в каком его аппендим Исключение Предупреждение(ОписаниеОшибки()); Отказ = Истина; КонецПопытки; |
|||
11
colci1981
20.05.14
✎
18:12
|
(10)Спасибо, только у вас процедура возвращает одно значение типа Numeric, а если нужно вернуть таблицу значений в виде курсора?
|
|||
12
Адский плющ
20.05.14
✎
18:18
|
(11) Чо то я подозреваю у тебя нет параметров в процедуре. Пjпробуй тупо RecordSet = cmd.Execute(); и потом читать RecordSet.
|
|||
13
colci1981
20.05.14
✎
18:24
|
Вот моя процедура на сервере:
PROCEDURE get_doc_for_1c(p_result OUT tcursor) IS BEGIN OPEN p_result FOR SELECT e.id_emitent, e.adres FROM ecfil037 e where e.id_tochki_obslugivaniya = 11; END get_doc_for_1c; |
|||
14
f_vadim
20.05.14
✎
18:28
|
(13) petrol+ :)
|
|||
15
ДенисЧ
20.05.14
✎
18:33
|
Наверное, я сейчас задам странный вопрос, но...
А назачем возвращать курсор, если можно просто вернуть таблицу и её уже перебирать? |
|||
16
f_vadim
20.05.14
✎
18:41
|
(0) а в sql*plus получается выполнить процедуру?
|
|||
17
shuhard
20.05.14
✎
18:42
|
(15) козырный вопрос, особенно в свете того, что и хранимка тут не нужна
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |