Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Запрос к хранимке в Oracle, получить выходной параметр (число прочтений - 3991 )
Lewkee
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 29
Зарегистрирован: 26. Февраля 2009
Запрос к хранимке в Oracle, получить выходной параметр
23. Ноября 2009 :: 10:22
Печать  
Доброго времени суток.
Вопрос такой. Подключаюсь к Oracle через драйвер ODBC
Нужно обратиться к хранимой процедуре, один из параметров которой исходящий (number)
Его мне и нужно получить, не совсем разобрался как это сделать.
Использую такой вот драйвер.
Код
Выбрать все
СтрокаСоединения = "DRIVER={Oracle in роль+";";
	БД = СоздатьОбъект("ODBCDataBase");
	БД.УстЗначениеТаймаута(Таймаут);
	Если Бд.Соединение(СтрокаСоединения)=0 Тогда
		Возврат 0;
	КонецЕсли;
	ЗапросОракл = СоздатьОбъект("ODBCRecordSet");
	ЗапросОракл.УстБД(Бд);
 



Процедура:
Код
Выбрать все
 procedure ins_upd_counteragents_2(v_id_oper in number, v_name in varchar2, v_id in number, v_id_account in number, v_id_contr out number) 


Последний параметр нужно получить.
Код
Выбрать все
ТекстЗапроса = "
	|{call director_budget.ins_upd_counteragents_2(0,'"+ Имя +"', 0,"+номер+", ?)}
	|";

	Если ЗапросОракл.Подготовить(ТекстЗапроса)=0 Тогда
		Сообщить("эх " + ЗапросОракл.ПолучитьОписаниеОшибки());
	КонецЕсли; 


выдает ошибку State 42000, native 0, message [Oracle][ODBC]Syntax error or access violation

Не совсем понял как мне нужно написать запрос и получить параметры. Толкового разъяснения как пользоваться методами ДобПараметр УстПараметр и т.п. не нашел, везде частный примеры.
Прошу помощи. заранее спасибо.
« Последняя редакция: 23. Ноября 2009 :: 12:39 - Lewkee »  
Наверх
www  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Запрос к хранимке в Oracle, получить выходной параметр
Ответ #1 - 23. Ноября 2009 :: 10:37
Печать  
Одинарные кавычки там часом не пропущены для varchar2?
Код
Выбрать все
ТекстЗапроса = "
	|{call director_budget.ins_upd_counteragents_2(0, '"+ Имя +"', 0,"+номер+", ?)}
	|";
                //тут нужно добавить параметр, но не понятно что за тип number
                ЗапросОракл.ДобПараметр(2,<nSQLType>,<nLen>,<nDec>,<pname>);
	Если ЗапросОракл.Подготовить(ТекстЗапроса)=0 Тогда
		Сообщить("эх " + ЗапросОракл.ПолучитьОписаниеОшибки());
	КонецЕсли;

 


Вообщем до Подготовить() нужно добавить параметр и кавычки поставить для varchar2. Но будет ли 1с++'ный ODBCRecordset работать с Ораклом ненаю. Можно попробовать через ADO, если не будет.
У меня в als вот такое есть для ДобПараметр(), оракловых типов тут нет конечно.
Цитата:
ДобПараметр(<?>)
Синтаксис:
ДобПараметр(<IOType>,<nSQLType>,<nLen>,<nDec>,<pname>)
Назначение:
добавляет описание параметра для параметризированного запроса.
Параметры:
<IOType> - (Число)  * 1 - SQL_PARAM_INPUT
* 2 - SQL_PARAM_OUTPUT
* 3 - SQL_PARAM_INPUT_OUTPUT
<nSQLType> - (Число)  * 1  - SQL_BIT
* 2  - SQL_TINYINT
* 3  - SQL_SMALLINT
* 4  - SQL_INTEGER
* 5  - SQL_REAL
* 6  - SQL_FLOAT
* 7  - SQL_DOUBLE
* 8  - SQL_TYPE_DATE
* 9  - SQL_TYPE_TIME
* 10 - SQL_TYPE_TIMESTAMP
* 11 - SQL_NUMERIC
* 12 - SQL_DECIMAL
* 13 - SQL_BIGINT
* 14 - SQL_CHAR
* 15 - SQL_VARCHAR
* 16 - SQL_LONGVARCHAR
* 17 - SQL_BINARY
* 18 - SQL_VARBINARY
* 19 - SQL_LONGVARBINARY
<nLen> - (Число)  длина
<nDec> - (Число)  точность
<pname> - (Строка)  Необязательный параметр.   именованный параметр вида Par1, необязательный
  
Наверх
 
IP записан
 
Lewkee
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 29
Зарегистрирован: 26. Февраля 2009
Re: Запрос к хранимке в Oracle, получить выходной параметр
Ответ #2 - 23. Ноября 2009 :: 11:09
Печать  
Кавычки - да при копировании забыл.
Через ODBC - работает отлично + удобно.
Работаю только через этот драйвер (Родной из клиента), работает отлично.
Но раньше были простые селекты либо хранимки без выходных параметров. Вот в первый раз понадобилось выходной параметр получить.
Через ADO когда то пробовал - получалось. Сейчас надо именно через ODBC, т.к. уже везде работаю него.

>>                //тут нужно добавить параметр, но не понятно что за тип number
в ODBC по-моему нужно после, или ошибаюсь?
  
Наверх
www  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Запрос к хранимке в Oracle, получить выходной параметр
Ответ #3 - 23. Ноября 2009 :: 11:23
Печать  
не, точно до, вот рабочий кусок кода, например
Код
Выбрать все
	RSOrders = СоздатьОбъект("ODBCRecordSet");
	RSOrders.УстБД(БДOrders);


	ТекстЗапроса = "{call sp_GetParams_UIObjectsConfig (?,?)}";

	RSOrders.ДобПараметр(1,14,128,,);//@uiID
	RSOrders.ДобПараметр(1,14,128,,);//@propID

	Если RSOrders.Подготовить(ТекстЗапроса) <> 1 Тогда
		Сообщить(RSOrders.ПолучитьОписаниеОшибки(),"!!!");Сообщить("//DEBUG: "+КОНСТ_КОД_ФОРМЫ+" 3");
		Возврат 0;

	КонецЕсли;

	Попытка
		RSOrders.УстПараметр(1,ИмяПараметра);
		RSOrders.УстПараметр(2,ИмяСвойста);
	Исключение
		Сообщить(ОписаниеОшибки(),"!!!");Сообщить("//DEBUG: "+КОНСТ_КОД_ФОРМЫ+" 4");
		Возврат 0;
	КонецПопытки;

	Попытка
		тз = RSOrders.ВыполнитьИнструкцию();
	Исключение
		Сообщить(RSOrders.ПолучитьОписаниеОшибки(),"!!!");Сообщить("//DEBUG: "+КОНСТ_КОД_ФОРМЫ+" 5");
		Возврат 0;
	КонецПопытки;
 

  
Наверх
 
IP записан
 
Lewkee
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 29
Зарегистрирован: 26. Февраля 2009
Re: Запрос к хранимке в Oracle, получить выходной параметр
Ответ #4 - 23. Ноября 2009 :: 12:00
Печать  
alexdd писал(а) 23. Ноября 2009 :: 11:23:
не, точно до, вот рабочий кусок кода, например


Спасибо.
А для исходящих параметров, я так понимаю, тоже самое, только Без "RSOrders.УстПараметр()", и для получения парметр - ПолучПараметр(1) после выполнения запроса?
  
Наверх
www  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Запрос к хранимке в Oracle, получить выходной параметр
Ответ #5 - 23. Ноября 2009 :: 12:10
Печать  
да, только в ДобПараметр() IOType будет 2
  
Наверх
 
IP записан
 
Lewkee
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 29
Зарегистрирован: 26. Февраля 2009
Re: Запрос к хранимке в Oracle, получить выходной параметр
Ответ #6 - 23. Ноября 2009 :: 12:29
Печать  
Отлично. Получилось.
Спасибо за помощь) Подмигивание
  
Наверх
www  
IP записан
 
Lewkee
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 29
Зарегистрирован: 26. Февраля 2009
Re: Запрос к хранимке в Oracle, получить выходной параметр
Ответ #7 - 23. Ноября 2009 :: 14:56
Печать  
Код
Выбрать все
	ТекстЗапроса = "
	|{call director_budget.ins_upd_counteragents_2(0, '"+ Имя +"', "+Ид+, "+Код+", ?)}
	|";
	ЗапросОракл.ДобПараметр(2,4,10,,);
	Если ЗапросОракл.Подготовить(ТекстЗапроса)=0 Тогда
		Сообщить("эх " + ЗапросОракл.ПолучитьОписаниеОшибки());
	КонецЕсли;
	Попытка
		ТЗ=ЗапросОракл.ВыполнитьИнструкцию();
	Исключение
		Сообщить(ЗапросОракл.ПолучитьОписаниеОшибки());
	КонецПопытки;

	Рез=ЗапросОракл.ПолучПараметр(1);
	Сообщить(Рез); 


Вот так работаетУлыбка

Вообще хотелось бы узнать мнение, это плохо или хорошо, что я параметрами не пользуюсь, а подставляю в текст запроса уже нужные мне данные? как например '"+ Имя +"' и т.п.
Я бы ими и не пользовался если бы выходной параметр не понадобился.
  
Наверх
www  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос к хранимке в Oracle, получить выходной параметр
Ответ #8 - 23. Ноября 2009 :: 15:14
Печать  
Цитата:
Вообще хотелось бы узнать мнение, это плохо или хорошо, что я параметрами не пользуюсь, а подставляю в текст запроса уже нужные мне данные? как например '"+ Имя +"' и т.п.
Я бы ими и не пользовался если бы выходной параметр не понадобился.

Да ничего особо не теряешь. Чтобы знать что теряешь нужно докапываться до тонкостей компиляции планов запросов ( для subj
Oracle ). Т.к. что текстовые константы что переменные используются
при вызове процедуры то сама процедура будет вызываться с параметрами и скорее всего скомпилирована один раз.
Отличие что я вижу при текстовых константах будет навярняка происходить неявное преобразование типов,
когда все через параметры этого скорее всего не будет.
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Запрос к хранимке в Oracle, получить выходной параметр
Ответ #9 - 23. Ноября 2009 :: 15:23
Печать  
Lewkee писал(а) 23. Ноября 2009 :: 14:56:
Вообще хотелось бы узнать мнение, это плохо или хорошо, что я параметрами не пользуюсь, а подставляю в текст запроса уже нужные мне данные? как например '"+ Имя +"' и т.п.
Я бы ими и не пользовался если бы выходной параметр не понадобился.

ну, например, если в строке Имя будет кавычка, при таком варианте получишь ошибку, если передать строку как параметр, драйвер правильно эту строку с кавычкой преобразует и передаст серверу. Но, вообщем, если там всегда константы, то нет смысла их добавлять как параметры, лишняя работа драйверуУлыбка
  
Наверх
 
IP записан
 
Lewkee
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 29
Зарегистрирован: 26. Февраля 2009
Re: Запрос к хранимке в Oracle, получить выходной параметр
Ответ #10 - 25. Ноября 2009 :: 09:54
Печать  
alexdd писал(а) 23. Ноября 2009 :: 15:23:
Lewkee писал(а) 23. Ноября 2009 :: 14:56:
Вообще хотелось бы узнать мнение, это плохо или хорошо, что я параметрами не пользуюсь, а подставляю в текст запроса уже нужные мне данные? как например '"+ Имя +"' и т.п.
Я бы ими и не пользовался если бы выходной параметр не понадобился.

ну, например, если в строке Имя будет кавычка, при таком варианте получишь ошибку, если передать строку как параметр, драйвер правильно эту строку с кавычкой преобразует и передаст серверу. Но, вообщем, если там всегда константы, то нет смысла их добавлять как параметры, лишняя работа драйверуУлыбка


Насчет кавычки четко подмечено)) Вчера столкнулся с таким.
Но тоже решил через замену их на " при записи элемента)))
Хотя надо бы все таки параметрами все таки пользоваться, действительно можно наткнуться на подводные камни..
  
Наверх
www  
IP записан
 
Lewkee
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 29
Зарегистрирован: 26. Февраля 2009
Re: Запрос к хранимке в Oracle, получить выходной параметр
Ответ #11 - 11. Декабря 2009 :: 13:17
Печать  
Доброго времени суток.
Почему то перестал работать запрос.
Точнее он не работал все это время, сейчас вернулся к старому, доделать. запускаю а оно:

Код
Выбрать все
ID=ЗапросОракл.ПолучПараметр(1);
{Глобальный модуль(22328)}: Недопустимое значение индекса параметра 



При этом после ВыполнитьИнструкцию()    КолвоПараметров()=0 почему-то, хотя до выполнения = 1. Код не изменялся по сравнению с вышеописанным.
Не пойму в чем проблема, кто нибудь может помочь?
  
Наверх
www  
IP записан
 
Lewkee
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 29
Зарегистрирован: 26. Февраля 2009
Re: Запрос к хранимке в Oracle, получить выходной параметр
Ответ #12 - 11. Декабря 2009 :: 14:54
Печать  
Разобрался, блин.)
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать