Что нового

[Данные, строки] Получение данных из БД Oracle

veselroger

Новичок
Сообщения
16
Репутация
3
Доброго времени суток. Есть некая база данных.

Есть некий запрос к бд, который я собираюсь отсылать формата:
Код:
CALL pkg.procedure(in1,in2,in3,in4,output)

Работаю с базой через объект созданный так:
Код:
ObjCreate("ADODB.Connection")

Ну и через объект RecordSeta
Код:
.ActiveConnection = $aSQL.db
.Source = запрос
.Open


Вопрос вот в чём: как мне получить этот самый output, который возвращает вышеприведённый вызов CALL?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
veselroger [?]
как мне получить этот самый output
Для начала заглянуть сюда
Далее попытаться самому что-либо написать, и если у вас в процессе возникает ошибка, и вы с ней не можете справиться, выложить сюда свой код и указать в чём у вас проблема.
 
Автор
veselroger

veselroger

Новичок
Сообщения
16
Репутация
3
В общем, не получается ничего.
Нашёл вроде как статьи про то, как это делается. Делается это через Command: http://www.w3schools.com/ado/ado_ref_command.asp
НО, ничего не работает.
Теперь подробнее:
1)Формирую массив с переменными вот так:
Код:
$FVar[5][1]="OBJECT_ID"		;Название параметра
$FVar[5][2]=3				;Его тип - 3 adInteger
$FVar[5][3]=2				;Выходной параметр
$FVar[5][4]=10				;Длинна параметра
$FVar[5][5]="1"				;Значение параметра

2)Потом отправляю в функцию вот так:
Код:
$data= SQL_Command("pkg_worker.insert_department",$FVar)

3)А вот код самой функции:
Код:
Func SQL_Command($cmd,$param)
   local $i,$dbname,$info,$outnum,$return
   local $pvaltype,$ptype,$value
   local $list[1]
   ;[1] - Подключаемся к БД
   $dbname=GUICtrlRead($BDinput)
   $ConString=StringReplace($ConString,"$dbname",$dbname)
   With $SQL
	  .ConnectionString = ($ConString) 
	  .ConnectionTimeout = 60
	  .Open
   EndWith
   If $SQL.state=0 Then
	  msgbox(0,"Ошибка!","Не удалось подключиться к "&$SQL_BD)
   Else
	  $SQLcmd.ActiveConnection = $SQL
	  $SQLcmd.CommandText = $cmd
	  $SQLcmd.CommandType = 4 ;4 - adCmdStoredProc
	  ;$SQLcmd.CommandText = $cmd
	  ;Блок создания переменных
	  For $i=1 to UBound($param)-1
		 Redim $list[1+$i]
		 $list[$i] = $SQLcmd.CreateParameter
		 With $list[$i]
			.Name = $param[$i][1]
			.Type = $param[$i][2]
			.Direction = $param[$i][3]
			.Size = $param[$i][4]
			.Value = $param[$i][5]
			If .Direction=1 then .Value = $param[$i][5]
		 EndWith
		 $SQLcmd.Parameters.Append($list[$i])
		 msgbox(0,"Создание переменной "&$i,"Успешно создали параметр: "&$list[$i].Name & @CRLF & $list[$i].Type & @CRLF & $list[$i].Direction & @CRLF & $list[$i].Size & @CRLF & $list[$i].Value)
	  Next
	  ;msgbox(0,"Command status",$SQLcmd.State)
	  ;If $SQLcmd.State=0 then 
		; $SQL.Close
		; Exit
	 ; EndIf
	  msgbox(0,"Команда:",$cmd)
	  $SQLcmd.Execute()
	  msgbox(0,"Command status",$SQLcmd.State)
	  $return=$SQLcmd.Parameters($outnum).value
	  return $return
   EndIf
EndFunc

В итоге вылетает с ошибкой на $SQLcmd.Execute()
А ещё где бы я не проверял State $SQLcmd он везде равен нулю.
Переменные для объектов SQL заданы в самом начале скрипта:
Код:
Global $SQL=ObjCreate("ADODB.Connection")
GLOBAL $RSet = ObjCreate( "ADODB.RecordSet" )
GLOBAL $SQLcmd= ObjCreate("ADODB.Command")

Использую OraOLEDB.Oracle

Не понимаю, в чём проблема. Интересует, можно ли тогда узнать, видит ли он эту процедуру. Почему он может не видеть её. Или по каким ещё причинам такое может происходить.
Пытался сделать через $SQLcmd.Parameters.Refresh, но данный провайдер не поддерживает этот метод, так же как и $SQLcmd.Parameters.Count. Вот как-то так =(
 
Автор
veselroger

veselroger

Новичок
Сообщения
16
Репутация
3
В общем, ответа я не получил. Ситуаций несколько, решил по-разному:
1)Если нужно вызывать хранимую процедуру, которая не возвращает данные - через обычный query через Connection.
2)Если нужно вызывать хранимую процедуру, которая возвращает данные(в переменную) - сделал костыли. Создаётся .sql файл с нужным кодом через AutoIT, а потом через sqlplus выполняется на БД - работает как надо, ошибок не выдаёт. Точно такой же код через Command или обычный query вызывает ошибку, что такое действие с объектом невозможно.
3)Если нужно вызывать хранимую процедуру, которая возвращает Recordset - таких у меня нету. Но если бы было, то скорей всего можно было бы через обычный query. Уж больно муторный этот Command.
 
Верх