|
Проблемы с процедурой для 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
|
я же писал уже, nls_lang надо подшаманить.
http://www.sql.ru/faq/faq_topic.aspx?fid=217 и др. https://www.google.ru/search?q=nls_lang+русский&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a#newwindow=1&client=firefox-a&hs=DrI&rls=org.mozilla:en-US%3Aofficial&sclient=psy-ab&q=nls_lang%20oracle&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.48705608,d.bGE&fp=5eb90b80c236b55e&biw=1366&bih=675&pf=p&pdl=300 |
|||
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 показано почему
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |