Имя: Пароль:
1C
1С v8
Вызов процедуры 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) козырный вопрос, особенно в свете того, что и  хранимка тут не нужна
Ошибка? Это не ошибка, это системная функция.