Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вызов процедуры Oracle и возврат рекордсета (ADO) / 25 сообщений из 50, страница 1 из 2
07.04.2010, 10:31
    #36565016
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Имеем примерно следующий код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
'Dim strCon
strCon = "Driver={Microsoft ODBC for Oracle};" &_
"CONNECTSTRING=(DESCRIPTION=" &_
"(ADDRESS=(PROTOCOL=TCP)" &_
"(HOST=test)(PORT=1521))" &_
"(CONNECT_DATA=(SERVICE_NAME=basetwo)));uid=test;pwd=test;"

'Dim oCon
'Dim oRs
'Dim oCMD
set oCMD = Server.CreateObject("ADODB.Command") 
set oCon = Server.CreateObject("ADODB.Connection")
set oRs = Server.CreateObject("ADODB.Recordset")
oCon.Open strCon

Set oCMD.ActiveConnection = oCon
set oCMD.CommandText = "TestScheme.TestServer.Test(?,?,?,?,?,?,?)"
set oCMD.CommandType = adCmdStoredProc
set oCMD.NamedParameters = True

oCMD.Parameters.Append(oCMD.CreateParameter("aDateFrom", adDBDate, adParamInput))
oCMD.Parameters.Append(oCMD.CreateParameter("aDateTo", adDBDate, adParamInput))
oCMD.Parameters.Append(oCMD.CreateParameter("aRURLimit", adNumeric, adParamInput))
oCMD.Parameters.Append(oCMD.CreateParameter("aUSDLimit", adNumeric, adParamInput))
oCMD.Parameters.Append(oCMD.CreateParameter("aEURLimit", adNumeric, adParamInput))
oCMD.Parameters.Append(oCMD.CreateParameter("aP1", adVarChar, adParamInput, 50 ))
oCMD.Parameters.Append(oCMD.CreateParameter("aP2", adVarChar, adParamInput, 50 ))

oCMD.Parameters("aDateFrom").Value = ZDate(D1,"")
oCMD.Parameters("aDateTo").Value = ZDate(D2,"")
oCMD.Parameters("aRURLimit").Value = X1
oCMD.Parameters("aUSDLimit").Value = X2
oCMD.Parameters("aEURLimit").Value = X3
oCMD.Parameters("aP1").Value = Q1
oCMD.Parameters("aP2").Value = Q2

Set oRs = oCon.Execute

На последней строчке выдается сообщение
авторNo value given for one or more required parameters.

1) Чего не так и как поправить?
2) Можно примерчик где обрабатывается рекордсет возвращаемый из процедуры. (не 1 значение в качестве параметра а именно рекордсет)
3) Есть ли варианты получить рекордсет через параметры - например вот таким способом

Код: plaintext
1.
2.
3.
Procedure Proc1(aParam1 In Integer, aParam2 Out Sys_RefCursor) Is
Begin
...
end;
...
Рейтинг: 0 / 0
07.04.2010, 11:05
    #36565137
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
А попробуйте-ка добавлять параметры не через .Append, а получите их с сервера .Parameters.Refresh
...
Рейтинг: 0 / 0
07.04.2010, 11:16
    #36565171
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Петров Андрей2) Можно примерчик где обрабатывается рекордсет возвращаемый из процедуры. (не 1 значение в качестве параметра а именно рекордсет)
Код: plaintext
1.
2.
3.
4.
5.
Do Until oRs.EOF
  Debug.Print oRs("ID"), oRs("Name")
  oRs.MoveNext
Loop
oRs.Close
set oRs=Nothing
...
Рейтинг: 0 / 0
07.04.2010, 11:18
    #36565177
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Петров Андрей3) Есть ли варианты получить рекордсет через параметры - например вот таким способом

Ну вы можете создать собственную функцию или класс. На входе будет массив или коллекция параметров, на выходе - рекордсет. Внутри все, что хочется инкапсулировать, от установки соединения до вызова процедуры.
...
Рейтинг: 0 / 0
07.04.2010, 11:25
    #36565202
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
у вас строка соединения неправильная. поищите на connectionstrings.com
...
Рейтинг: 0 / 0
07.04.2010, 11:43
    #36565265
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Строка правильная... :-) проверено через WinSQL соединяется и выполняет запросы.
Болше того строка с указанного сайта:
авторDriver={Microsoft ODBC for Oracle};Server=myServerAddress;Uid=myUsername;Pwd=myPassword;

Выдает ошибку: Could not resolve TNS в отличие от указаной в примере.
...
Рейтинг: 0 / 0
07.04.2010, 11:54
    #36565332
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Shocker.ProА попробуйте-ка добавлять параметры не через .Append, а получите их с сервера .Parameters.Refresh

Те можно их получить из процедуры?
Оки пробуем...

Код: plaintext
1.
2.
3.
4.
5.
oCon.Open strCon
oCMD.ActiveConnection = oCon
oCMD.CommandText = "test(?,?,?,?,?,?,?)"
oCMD.CommandType = adCmdStoredProc
oCMD.NamedParameters = True
oCMD.Parameters.Refresh

Так? Можно еще ссылочку/строчку как включить константы в код... А то тестовый VBA у меня их не знает...
...
Рейтинг: 0 / 0
07.04.2010, 11:57
    #36565343
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Shocker.ProПетров Андрей2) Можно примерчик где обрабатывается рекордсет возвращаемый из процедуры. (не 1 значение в качестве параметра а именно рекордсет)
Код: plaintext
1.
2.
3.
4.
5.
Do Until oRs.EOF
  Debug.Print oRs("ID"), oRs("Name")
  oRs.MoveNext
Loop
oRs.Close
set oRs=Nothing


Имелся ввиду примерчип процедуры Oracle (ее описание) и код который выцепляет из нее рекордсет а не пример обхода рекордсета - это то и так понятно...

Но все равно спасибо.
...
Рейтинг: 0 / 0
07.04.2010, 12:07
    #36565390
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Ваш вопрос нельзя было трактовать иначе

По Ораклу не спец...
...
Рейтинг: 0 / 0
07.04.2010, 12:18
    #36565437
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Ну короче VBA говорит что ODBC не поддерживает Sys_RefCursor а именно рекордсет в качестве параметров или результатов процедуры. Обидно!

Есть еще варианты вернуть рекордсет из процедуры?
...
Рейтинг: 0 / 0
07.04.2010, 12:19
    #36565440
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Предлагаю вам тогда пойти в ветку по Ораклу
...
Рейтинг: 0 / 0
07.04.2010, 12:23
    #36565465
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Петров АндрейСтрока правильная... :-) проверено через WinSQL соединяется и выполняет запросы.
Болше того строка с указанного сайта:
авторDriver={Microsoft ODBC for Oracle};Server=myServerAddress;Uid=myUsername;Pwd=myPassword;

Выдает ошибку: Could not resolve TNS в отличие от указаной в примере.

это потому что вы tns-name неправильное задаёте или у вас не настроен tnsnames.ora или вообще не установлен оракловый клиент. и что такое winsql? вы через udl-файлик протестируйте для начала и не забудьте сначала проверить соединение с ораклом с помощью tnsping и тд и тп

а процедурки оракловые, чтобы могли возвращать рекордсет, котрой понимает микрософт должны быть описаны с возвратом курсора типа refcursor, объявленного в пакете оракловом
...
Рейтинг: 0 / 0
07.04.2010, 12:28
    #36565489
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
[SQL]create or replace package ExtractPKG is
-- Public type declarations
Type EXTRACT_TYPE is REF CURSOR;

end ExtractPKG;

create or replace procedure UserAccess(USER_CURSOR OUT extractpkg.EXTRACT_TYPE)
is
sSQL varchar2(2000);
begin
sSQL := 'Select * from useraccess';
open user_cursor
for
sSQL;
end;[/SQL]

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cm As ADODB.Command


Private Sub Form_Load()

    Set cnn = New ADODB.Connection
    
    With cnn
        .CursorLocation = adUseClient
        .Provider = "MSDAORA.1"
        .ConnectionString = "Data source=tnsname; user id=uid;password=pwd"
        .Open
    End With
    
    Set cm = New ADODB.Command
    
    With cm
        .ActiveConnection = cnn
        .CommandType = adCmdStoredProc
        .CommandText = "UserAccess"
    End With

    Set rs = New ADODB.Recordset
    Set rs = cm.Execute

    debug.print rs.recordcount

    rs.close
    set rs= nothing 

End Sub
...
Рейтинг: 0 / 0
07.04.2010, 12:59
    #36565617
kiv-1980
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Конекчусь так, проблем не наблюдаю, данный вариант весьма неплох:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
String_connect = "Provider=OraOLEDB.Oracle.1;Password=dba;Persist Security Info=True;User ID=dba;Data Source=TestDB;"
   Set Connection1 = CreateObject("ADODB.Connection")
   Set rs = CreateObject("ADODB.Recordset")
   Set cmd = CreateObject("ADODB.Command")

      Connection1.CursorLocation =  3 
      cmd.ActiveConnection = Connection1
      cmd.CommandType =  1 
      cmd.Properties("PLSQLRSet") = True
      cmd.CommandText = "{CALL dba.package.user_info}"
   Set rs = cmd.Execute(adAsyncExecute)
      cmd.Properties("PLSQLRSet") = False
      Username = rs("UserName") ' получаем инфу
   Set rs = Nothing

Также мне нравится работать с oo4o, с ним меньше всего траблов, когда нужно отправлять много информации на обработку, связанную с обработкой множества процедур и функций.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim username$, Password$, DatabaseName$, Connect$
username$ = dba
Password$ = dba
DatabaseName$ = TestDB
Connect$ = username$ + "/" + Password$
 Set OraSession = CreateObject("OracleInProcServer.XOraSession")
 Set OraDatabase = OraSession.OpenDatabase(TestDB$, Connect$,  0 &)
     OraDatabase.Parameters.Add "USERNAME", Admin, ORAPARM_INPUT
     OraDatabase.Parameters("USERNAME").serverType = ORATYPE_VARCHAR
     OraDatabase.ExecuteSQL ("declare Begin dba.package.user_save(:USERNAME); end;")
 Set OraDatabase = Nothing

Более подробно и даже примерно нужно искать в оракловом oo4o, там много полезного.
...
Рейтинг: 0 / 0
07.04.2010, 14:12
    #36565915
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Ага всем спасибо - буду пробовать ставить ораклового клиента и перепроверюсь. Его есессно нету иначе не тестил бы на майкрософтовском драйвере.
...
Рейтинг: 0 / 0
07.04.2010, 14:24
    #36565957
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
2 Konst_One

В примерчике параметр передается как out для процедуры. Если сделать функцию - переварит? Оно как бы логичнее...
...
Рейтинг: 0 / 0
07.04.2010, 14:25
    #36565963
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
можно и паблик ф-ю оракловую, но ref cursor должен быть в описании пакета объявлен
...
Рейтинг: 0 / 0
07.04.2010, 15:19
    #36566172
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Экспериментирую...

Функция вида:

Код: plaintext
1.
2.
3.
4.
5.
Procedure Test(aDateFrom   Date,
                             aDateTo     Date Default SysDate,
                             aRURLimit   Float Default  300000 ,
                             aUSDLimit   Float Default  10000 ,
                             aEURLimit   Float Default  7000 ,
                             aCursor     Out TRefCursor)

ее вызов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Dim strCon
Dim oCon
Dim oRs
Dim oCMD

strCon = "Driver={Oracle in Oracle_V9i};Dbq=basetwo.world;uid=test;pwd=test;"
'strCon = "Provider=OraOLEDB.Oracle.1;Persist Security Info=True;uid=test;pwd=test;Data Source=ora_basetwo;"
'strCon = "Driver={Microsoft ODBC for Oracle};Server=vosw00000495;uid=test;pwd=test;"

Set oCMD = CreateObject("ADODB.Command")
Set oCon = CreateObject("ADODB.Connection")
Set oRs = CreateObject("ADODB.Recordset")
Set oParam = CreateObject("ADODB.Parameter")

oCon.Open strCon
oCMD.ActiveConnection = oCon
oCMD.CommandText = "reports.test"
oCMD.CommandType =  4 
oCMD.NamedParameters = True
oCMD.Parameters.Refresh

oCMD.Parameters("aDateFrom").Value = DateSerial( 2010 ,  1 ,  1 )
oCMD.Parameters("aDateTo").Value = DateSerial( 2010 ,  5 ,  1 )
oCMD.Parameters("aRURLimit").Value =  300000 
oCMD.Parameters("aUSDLimit").Value =  10000 
oCMD.Parameters("aEURLimit").Value =  7000 

Set oRs = oCMD.Execute

Выдает:
...
Рейтинг: 0 / 0
07.04.2010, 15:22
    #36566177
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
и на какой строке кода такое вам выдаёт?
...
Рейтинг: 0 / 0
07.04.2010, 15:24
    #36566183
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
oCMD.NamedParameters = True
oCMD.Parameters.Refresh

не поможет, именованную коллекцию скорее всего не получите. придётся вам ручками создавать параметры и добавлять в Parameters. не забываем, что первым всегда должен быть параметр с именем RET с типом output
...
Рейтинг: 0 / 0
07.04.2010, 15:28
    #36566202
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Private Function OraMESSAGE() As Long
Dim cmd As ADODB.Command
Dim p As ADODB.Parameters

'    If CN_ORA Is Nothing Then Exit Function
    ' Вызов процедуры заполнения шаблонов сообщений

    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = CN_ORA
    cmd.CommandTimeout =  20 
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "MYPKG.OraMESSAGE"
    ' Описание параметров
    Set p = cmd.Parameters
    p.Append cmd.CreateParameter("RET", adInteger, adParamReturnValue)
    cmd.Execute
    OraMESSAGE = p("RET").Value
    Set p = Nothing
    Set cmd = Nothing
    
End Function
...
Рейтинг: 0 / 0
07.04.2010, 15:29
    #36566205
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Коллекцию я получаю без проблем.
Падает на последней строке = Execute.
...
Рейтинг: 0 / 0
07.04.2010, 15:30
    #36566208
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
TRefCursor - это что? описание из заголовка пакета привидите
...
Рейтинг: 0 / 0
07.04.2010, 15:32
    #36566217
Петров Андрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
type TRefCursor is ref cursor;
--type TRefCursor is Sys_RefCursor;
Procedure Test(RET        Out TRefCursor,
                             aDateFrom   Date,
                             aDateTo     Date Default SysDate,
                             aRURLimit   Float Default  300000 ,
                             aUSDLimit   Float Default  10000 ,
                             aEURLimit   Float Default  7000 );
...
Рейтинг: 0 / 0
07.04.2010, 15:36
    #36566232
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов процедуры Oracle и возврат рекордсета (ADO)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE OR REPLACE package TEST.TST as
cursor em is select * from emp;
type c1 is ref cursor return em%rowtype;
FUNCTION EMPL return c1;
end; 
/

CREATE OR REPLACE package body TEST.TST as
FUNCTION EMPL return  c1 is
  tmp c1;
BEGIN
	 open tmp for 
	 	  select * from emp;
	return tmp;
end EMPL;
end; 
/

вот пример рабочего кода
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вызов процедуры Oracle и возврат рекордсета (ADO) / 25 сообщений из 50, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]