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

Код: 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
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36565137
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А попробуйте-ка добавлять параметры не через .Append, а получите их с сервера .Parameters.Refresh
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36565171
Фотография 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
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36565177
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петров Андрей3) Есть ли варианты получить рекордсет через параметры - например вот таким способом

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

Выдает ошибку: Could not resolve TNS в отличие от указаной в примере.
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36565332
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36565343
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36565390
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш вопрос нельзя было трактовать иначе

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

Есть еще варианты вернуть рекордсет из процедуры?
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36565440
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предлагаю вам тогда пойти в ветку по Ораклу
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36565465
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петров АндрейСтрока правильная... :-) проверено через 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
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36565489
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[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
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36565617
kiv-1980
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конекчусь так, проблем не наблюдаю, данный вариант весьма неплох:
Код: 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
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36565915
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага всем спасибо - буду пробовать ставить ораклового клиента и перепроверюсь. Его есессно нету иначе не тестил бы на майкрософтовском драйвере.
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36565957
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Konst_One

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

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

Код: 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
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566177
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и на какой строке кода такое вам выдаёт?
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566183
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oCMD.NamedParameters = True
oCMD.Parameters.Refresh

не поможет, именованную коллекцию скорее всего не получите. придётся вам ручками создавать параметры и добавлять в Parameters. не забываем, что первым всегда должен быть параметр с именем RET с типом output
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566202
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566205
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллекцию я получаю без проблем.
Падает на последней строке = Execute.
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566208
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TRefCursor - это что? описание из заголовка пакета привидите
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566217
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566232
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
25 сообщений из 50, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вызов процедуры Oracle и возврат рекордсета (ADO)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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