Имя: Пароль:
1C
1С v8
Проблемы с процедурой для Oracle
0 Dr2013
 
13.07.13
14:45
Всем добрый день!
Имеется процедура на оракле с двумя параметрами один in другой out.
при вызове выдает такое сообщение
{Форма.ФормаОтчета.Форма(81)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (OraOLEDB):

И все без какого либо продолжения

вот текст
///Описание параметров
Процедура СоздатьПараметр(extCommSQL, названиеПараметр, текстПараметр,Тип=205,Вид=1 )
   Параметр= extCommSQL.CreateParameter(названиеПараметр,Тип,Вид,СтрДлина(текстПараметр)+1,текстПараметр);
   extCommSQL.Parameters.append(Параметр);
КонецПроцедуры
Процедура СоздатьПараметрOUT(extCommSQL, названиеПараметр, текстПараметр,Тип=205,Вид=2 )
   Параметр= extCommSQL.CreateParameter(названиеПараметр,Тип,Вид,СтрДлина(текстПараметр)+1,текстПараметр);
   extCommSQL.Parameters.append(Параметр);
КонецПроцедуры
/// вызов процедуры
Процедура СоздатьДокумент
Command = Новый COMОбъект("ADODB.Command");
   // Указание активного соединения

   Command.ActiveConnection = Соединение;
 
   Command.CommandTimeout = 0;
   Command.CommandType = 4; //adCmdStoredProc    
   Command.CommandText = "pk.procDoc";
   // Определение текста команды
  СоздатьПараметр(Command, "p_in"  , "ПАРАМЕТР",12);
  СоздатьПараметрOUT(Command, "p_out"  , "Параметр Оут",12);
  Command.Prepared = true;
 Попытка
       Command.Execute();
       Ошибка = Ложь;
   Исключение
       Ошибка = Истина;
       ОписаниеОшибки = ОписаниеОшибки();
       Сообщить(ОписаниеОшибки);
   КонецПопытки;    
КонецПроцедуры
1 sda553
 
13.07.13
14:58
у ошибок обычно есть номер вида ORA-XXXXX
2 Dr2013
 
13.07.13
15:13
Вот именно что без всяких расшифровок!
3 Живой Ископаемый
 
13.07.13
15:21
Заставь процедуру вызывать осмысленное исключение
Вот буквально первой строкой чтобы вызывалось исключение с текстом, ну например "случилась жеппа какая-то"
4 sda553
 
13.07.13
15:24
(2) Ну запусти, например, из екселя такой код. Может там чего осмысленнее выдаст
5 Dr2013
 
13.07.13
21:01
Может у кого есть материал по COMОбъект или ссылки 1С 8.2?
6 Живой Ископаемый
 
13.07.13
21:02
что?
7 Живой Ископаемый
 
13.07.13
21:03
что такое ссылки 1с 8.2?
8 mistеr
 
13.07.13
22:16
(0) Я думаю, все претензии к непонятной прослойке под названием extCommSQL.

А смотреть, что возвращает процедура, нужно без всяких посредников, то есть в SQL*Plus
9 Живой Ископаемый
 
13.07.13
22:24
2(8) Это не прослойка, это название параметра, в качестве передаваемого значения там оказывается АДОДБ.Комманд, вполне себе годный объект
10 Dr2013
 
13.07.13
23:23
в SQL*Plus все отрабатывает нормально без ошибок!!!!
11 mistеr
 
13.07.13
23:40
(9) Ну откуда мне это знать? И откуда, кстати ты знаешь?
12 Живой Ископаемый
 
14.07.13
00:21
2(11) я внимательно читаю текст, в котором написано:
Command = Новый COMОбъект("ADODB.Command");
<.....>
  СоздатьПараметр(Command, "p_in"  , "ПАРАМЕТР",12);//созданный АдоДБ.Команд пошел первым параметром в вызов процедуры, которая определена выше

Процедура СоздатьПараметр(extCommSQL, названиеПараметр, текстПараметр,Тип=205,Вид=1 )
   Параметр= extCommSQL.CreateParameter(названиеПараметр,Тип,Вид,СтрДлина(текстПараметр)+1,текстПараметр);
   extCommSQL.Parameters.append(Параметр);
КонецПроцедуры


не заметить это способен только человек давно не посещавший своего офтальмолога. либо то, который ничего не смыслит в параметрах процедур
13 Живой Ископаемый
 
14.07.13
00:23
2(10) создай простую хранимку которая вернет например select 2*2 from dual
безо всяких параемтров, и потом попробуй ее выполнить через АдоДб.Комманд. потом усложни ее. добавив входной параметр, и тоже выполни. потом еще, добавив выходной параметр. Короче усложняй, и ты поймешь на каком шаге лажает. так ты по крайней мере локализуешь проблему.
14 Dr2013
 
14.07.13
02:02
Спасибо за совет попробую.
Еще вопрос когда вызываешь не процедуру а выполняешь напрямую инсерт в оракл выдает ошибку "имя кодовой таблицы не опознано" в чем проблема и как указывать кодовую страницу?
15 sda553
 
14.07.13
06:49
(14) там какое то шаманство надо с ns_lang в реестре делать на стороне клиента.
(11) это пять! Меняй ник теперь
16 Живой Ископаемый
 
14.07.13
07:50
2(15) э.. на какой? на миссис? почему?
17 mistеr
 
14.07.13
18:05
(12) Да, не заметил. :)Сходить что ли к офтальмологу...
18 Dr2013
 
15.07.13
10:05
PLS-00553: имя кодовой таблицы не опознано
ORA-06550: Строка 0, столбец 0:
PL/SQL: Compilation unit analysis terminated


кто подскажет что необходимо настроить на клиенте что бы эта ошибка не выходила?
19 sda553
 
15.07.13
10:15
20 tplink741nd
 
15.07.13
10:21
для чего писать процедуры тело которых состоит из двух строк?
21 sda553
 
15.07.13
10:37
(20) Тебя не смутило, что текст двух процедур один и тот же.
В данном случае для повышения читабельности кода.

Есть те кто не любит вспоминать, что делает строка
extCommSQL.CreateParameter(названиеПараметр,205,1,СтрДлина(текстПараметр)+1,текстПараметр);

и чем она отличается от
extCommSQL.CreateParameter(названиеПараметр,205,2,СтрДлина(текстПараметр)+1,текстПараметр);

Преобразование этих строк в понятные СоздатьПараметрOUT и СоздатьПараметрIN добавляет очков к читабельности
22 Dr2013
 
15.07.13
19:49
всем спасибо за ответы. я разобралась сама.
если указывать не через переменные то все работает!
23 Живой Ископаемый
 
15.07.13
20:54
2(22) в смысле? что это значит? можно итоговый код?
24 Dr2013
 
16.07.13
10:46
Процедура СоздатьДокумент
Command = Новый COMОбъект("ADODB.Command");
   // Указание активного соединения


   Command.ActiveConnection = Соединение;
 
   Command.CommandTimeout = 0;
   Command.CommandType = 1;    

   Command.CommandText = "begin pk.procDoc(p_in=>"+"ПАРАМЕТР"+",p_out=>"+"Параметр2"+"); end;"
 Попытка
       Command.Execute();
       Ошибка = Ложь;
   Исключение
       Ошибка = Истина;
       ОписаниеОшибки = ОписаниеОшибки();
       Сообщить(ОписаниеОшибки);
   КонецПопытки;    
КонецПроцедуры
25 Живой Ископаемый
 
16.07.13
11:08
э... и как же вы передаете значение параметра?
а если этим параметром будет не числовое или строковое значение, а например содержимое двоичного файла?
26 Infsams654
 
16.07.13
11:56
(24) что это ? это действительно так написано или не верю, "ПАРАМЕТР" "Параметр2 от куда появяться?
27 Живой Ископаемый
 
16.07.13
12:10
2(26) нет, это враки, у нее даже процедура оформлена неправильно
28 Infsams654
 
16.07.13
12:14
(27) ну transact sql, или не вижу там про что, PL/SQL не дал бы совсем неправильно создать процедуру
29 tplink741nd
 
16.07.13
12:21
(24) ну вот видишь и зачем были эти понты с процедурами, все гениально - просто.
30 Живой Ископаемый
 
16.07.13
13:47
2(28) ты здоров вообще? какой транзакт?
1Совская процедура:

Процедура СоздатьДокумент

где в этом объявлении ты видишь параметры?
31 Infsams654
 
16.07.13
14:35
(30) "ты здоров вообще?"
это что
Command.CommandText = "begin pk.procDoc(p_in=>"+"ПАРАМЕТР"+",p_out=>"+"Параметр2"+"); end;"
?
Command.Execute();
??

неважно, транзакт или оракл - принцип один, процедура должна быть нормальной и через ADO ее надо вызывать не по-дурацки
32 Живой Ископаемый
 
16.07.13
16:28
2(31) в (26) ты спрjсил откуда взялся ПАРАМЕТР? на что я тебе ответил, что в (24) она привела враки а не настоящий код, потому что там даже неправильно оформлена

http://screencast.com/t/JpX4FVOkN
итого в в(24) приведены враки.
33 Dr2013
 
16.07.13
21:19
народ вы че!
я просто собираю текст
конкретно в CommandText передаю такой текст который собираю динамически, то есть не Command.CommandType = 4; сторедпроцедур, а Command.CommandType = 1; и исполняю. А со сторедпроцедур ругается на кодовую страницу, изменю ее в клиенте как в базе все равно ругается. Так что пришлось выкрутиться так.
34 Живой Ископаемый
 
16.07.13
21:22
Еще раз, какое значение параметр? В (24) ложный код, который даже не откомпилируется в 32 показано почему