Имя: Пароль:
1C
1С v8
ошибка при вызове хранимой процедуры Oracle
0 Sponger
 
11.11.15
13:34
Все привет.
Есть проблема.
Вызываю хранимую процедуру Oracle, но выдает ошибку. Ругается на параметры, но не могу догнать в чем беда. Помогите плиз.

Это хранимка
p_lastdate - передаваемый параметр, дата
p_rates - курсор
pkg_1c_api.get_rate(p_lastdate => :p_lastdate, p_rates => :p_rates);

не понимаю что надо передать в p_rates



Попытка
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Provider = "OraOLEDB.Oracle.1";
Connection.ConnectionString = "моя строка подключения";
Connection.Open();
        
adCmdStoredProc = 4;
    
adParamInput = 1;
        
adDate = 7;
        
Cmd = Новый COMОбъект("ADODB.Command");
Cmd.ActiveConnection = Connection;
Cmd.CommandText = "pkg_1c_api.get_rate";
Cmd.CommandType = adCmdStoredProc;
    
Param1 = Cmd.CreateParameter("@p_lastdate", adDate, adParamInput, 4, Дата(2015,10,1));
Cmd.Parameters.Append(Param1);
        
//Param2 = Cmd.CreateParameter("p_rates", adNumeric, adParamOutput, 4, NULL);
//Cmd.Parameters.Append(Param2);
        
Попытка
RecordSet = Новый COMОбъект("ADODB.RecordSet");
RecordSet = cmd.Execute(); // вот в этой строке ошибка

Пока (RecordSet.State=0) цикл
RecordSet=RecordSet.NextRecordset();
КонецЦикла;
Исключение
Предупреждение(ОписаниеОшибки());
Отказ = Истина;
КонецПопытки;        
Исключение
Предупреждение("Не удалось создать подключение!");
КонецПопытки;
1 Sponger
 
11.11.15
13:39
Ошибка
ORA-06550: строка1, столбец7: PLS-00306: ошибочно число или типы аргументов при обращении к GET_RATE
ORA-06550: строка1, столбец7
PL/SQL: Statement ignored
2 mistеr
 
11.11.15
13:45
(0) > не понимаю что надо передать в p_rates

Сказано же - курсор. В 1С такого зверя нет. Получить его можно в PL/SQL или, если хитро извернуться, в программе на C++.

Если переформулировать для блондинок, эта хранимка не предназначена для вызова из 1С.
3 Sponger
 
11.11.15
13:54
т.е. хранимку надо переписать чтобы она возвращала курсор не в параметр?
4 Sponger
 
11.11.15
13:58
ПЕРЕФРАЗИРУЮ
надо переписать чтобы возвращала не курсор, а таблицу (набор записей, RECORDSET)

c Oracle впервые пытаюсь вытащить что-то
5 mistеr
 
11.11.15
13:59
(3) Да, сделать обертку-функцию.
6 Sponger
 
11.11.15
14:19
(5) она должна делаться в Oracle?
7 Sponger
 
11.11.15
14:22
а вот такой вариант делал ктонить?

- Установить (ИМХО лучше на сервере mssql) клиента Oracle
- Настроить ODBC к Oracle
- в mssql настроить Linked Servers к ораклу
- написать хранимку в mssql, которая будет принимать ваши параметры и транслировать в хранимку на оракле, возвращая вам результат. ИЛИ делать выборку из представления...
- в оракле написать хранимку по сбору нужных данных или представление, из которого сиквеловский скрипт будет селектить данные (в зависимости от условий - возможно это даже предпочтительней)



В Oracle для меня никто не будет ничего переписывать.
Потому надо найти выход.
8 МихаилМ
 
11.11.15
14:37
сделайте обертку - psql скрипт.

и вызывайте не хранимую процедуру , а комманду - скрипт , который будет вызвать хранимую процедуру.
9 Sponger
 
11.11.15
14:44
(8) я и спрашиваю. Обертку в Oracle делать?
10 Sponger
 
11.11.15
14:45
(8) примеры не скинете ссылку?
11 mistеr
 
11.11.15
14:48
(6) Можно попробовать в анонимном блоке.

(7) Код хранимки есть?
12 Sponger
 
11.11.15
15:01
(11) Завтра попробую код хранимки взять
13 Sponger
 
12.11.15
06:58
(11) с кодом засада. Не будет кода.
Только вызов и входящие параметры. я уже написал их.
14 Sponger
 
12.11.15
06:59
(8) примеры не скинете или ссылку на описание как делать?
15 Repey
 
12.11.15
07:28
Это у тебя все же процедура или функция?
Дай пример вызова прямо из оракла.
16 Sponger
 
12.11.15
10:46
(15) процедура.
Ораклоиды код не дают. Первый раз Оракл вижу, и надо получить данные.
Вот все что есть.

pkg_1c_api.get_rate(p_lastdate => :p_lastdate, p_rates => :p_rates);


p_lastdate - передаваемый параметр, дата
p_rates - курсор
17 mistеr
 
12.11.15
11:45
(16) Единственное, что могу сказать. Если бизнесу нужны эти данные в 1С, все административные препятствия преодолеваются на раз. Выходи на заинтересованных лиц и решай вопрос. Иногда кодер должен на минутку становиться манагером.
18 Repey
 
12.11.15
12:34
(16) То есть это процедура, и она тебе возвращает курсор "p_rates"?
19 Sponger
 
12.11.15
13:06
(18) да.
20 Repey
 
12.11.15
13:19
(19) Сколько полей на выходе должно получиться?
Ориентировочное количество записей?
21 Sponger
 
12.11.15
13:26
В курсоре сейчас

       CURR_ID    RATE    FROMDATE    CURRENCYCODE    TEXT    ISOCODE
1    1    273,53    08.10.2015 23:59:59    USD    Американский доллар    840
22 Sponger
 
12.11.15
13:28
блин, нет форматирования.
Получается 6 полей.
23 Repey
 
12.11.15
14:06
А записей сколько?
Если немного - можно собрать результат в строку с разделителями, а на стороне 1С уже разобрать ее.
Иначе вижу только вариант с временной таблицей.
В любом случае, считаю, это будет лучше, чем доп. звено добавлять.
Развивать тему?
24 Sponger
 
12.11.15
14:23
(23) может в личку?

пока в курсоре у меня 1 запись.
Но мне надо понять механизм.
В дальнейшем будет много.
Я бы не отказался от обоих вариантов и с разделителями и с временной таблицей.
25 Sponger
 
12.11.15
14:29
вот код хранимки

select * from table(pkg_1c_api.get_rate(p_lastdate => to_date('01.10.2015','dd.mm.yyyy')))
26 mistеr
 
12.11.15
15:47
(25) Вот и делай такой же select, через Statement.
27 Sponger
 
13.11.15
05:57
(26) что есть Statement?
Как мне его из 1С организовать?
28 Мэс33
 
13.11.15
06:19
29 Мэс33
 
13.11.15
06:24
30 mistеr
 
13.11.15
10:22
(27) Не, Statement это я напутал. Тот же Command, только с другим CommandType.
31 Sponger
 
13.11.15
10:25
(28) спрасибо.

        
НаборЗаписей = Connection.Execute("select * from table(pkg_1c_api.get_rate('"+ Формат(ТекДата, ФорматДаты) + "'))");
        
Для каждого СтрокаИтем Из НаборЗаписей.Fields Цикл
    Если ТЗ.Колонки.Количество() <> НаборЗаписей.Fields.Count Тогда
        НоваяСтрока[СтрокаИтем.Name] = СтрокаИтем.Value;
    КонецЕсли;
КонецЦикла;        

вот так заработало. Правда у меня в курсоре 1 строка. Щас проверю с набором строк.
32 Sponger
 
13.11.15
10:43
да. Таким методом я получаю набор строк, но работаю только с первой строкой набора.

Как получить все строки?
33 Sponger
 
13.11.15
10:46
Протупил.

НаборЗаписей.moveNext()

работает.