|
ошибка при вызове хранимой процедуры 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() работает. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |