powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вызов процедуры Oracle и возврат рекордсета (ADO)
50 сообщений из 50, показаны все 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
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566303
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример действительно рабочий :-)
Но есть одно но. Допустим в процедуру передаются параметры - как мне тогда задать курсор в спецификации пакета если в нем есть переменные из процедуры (критерии отбора)?

Вобщем я понял идею буду пробовать пинать ораклоидов.
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566326
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
...
FUNCTION EMPL(param1 varchar2( 100 ),param2 date ....) return  c1 is
  tmp c1;
BEGIN
	 open tmp for 
	 	  select * from emp where field1=:param1;
	return tmp;
end EMPL;
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566337
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что в спецификации написать когда задаем курсор?
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566348
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
cursor em is select * from emp;
type c1 is ref cursor return em%rowtype;
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566357
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не получится. Выборка сложная слишком а не просто из талбички - там 7 переменных с джойнами и группировками.
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566358
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почитайте уж что-нибудь по ораклу
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566394
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага спасибо за ссылку и за помощь.
Я так понимаю что придется прописывать структуры для всех возвращаемых запросов руками - ужос!
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566419
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) ConnStr = "DSN=ORACLE9I; User ID=scott; Password=tiger"
2) ConnStr = "Provider=MSDAORA.1; Data Source=ORACLE9I; User ID=scott; Password=tiger"

вот такие варианты могут работать с SYS_REFCURSOR структурой. пробуйте
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566428
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буду пробовать все котрые Вы дали мне по ссылке на connectionstrings
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566437
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я пример кода выше уже приводил с провайдером MSDAORA.1
на нём и пробуйте.
вот ещё посмотрите примеры реализации (раздел для оракла и там есть ссылочка в конце на архив с примерами)
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566464
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MSDAORA.1

выдает
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566497
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и что там на этой строчке?
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566509
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как что? Сточка №1 - вызов процедуры а точнее просто ее имя без параметров.
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566515
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
текст пакета своего ораклового сюда выложите. эта ошибка внутри оракла.
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566559
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE OR REPLACE PACKAGE Test_reports IS
Function Cursor_Test(aTest VarChar2) Return Sys_refCursor;
End Test_Reports;

CREATE OR REPLACE PACKAGE BODY Test_reports IS

Function Cursor_Test(aTest VarChar2) Return Sys_refCursor
Is
fReturn   Sys_RefCursor;
Begin
 		 Open fReturn For select '01' Test from dual
                union select '02' Test from dual;
     Return fReturn;
Exception
         When Others Then
				      Raise;
End Cursor_Test;

End Test_Reports;

VBA

Код: 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.
Sub Test()
Dim strCon
Dim oCon
Dim oRs
Dim oCMD

strCon = "Provider=MSDAORA.1; Data Source=test; User ID=test; Password=test"
Set oCMD = CreateObject("ADODB.Command")
Set oCon = CreateObject("ADODB.Connection")
Set oRs = CreateObject("ADODB.Recordset")

oCon.Open strCon
oCMD.ActiveConnection = oCon
oCMD.CommandText = "Test_Reports.Cursor_Test"
oCMD.CommandType =  4 
oCMD.NamedParameters = True
oCMD.Parameters.Refresh

oCMD.Parameters("aTest").Value = "TEST"

Set oRs = oCMD.Execute
Do Until oRs.EOF
  Debug.Print oRs("Test")
  oRs.MoveNext
Loop
oRs.Close
Set oRs = Nothing
End Sub

VBA - это макрос Excel если это важно.
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566590
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sys_refCursor - зачем вы специально коверкаете системные названия?
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566596
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас этот пакет вообще в оракле работает?
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566601
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аха :-) еще как.
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566641
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE PACKAGE test_reports IS
Function сursor_test() return sys_refcursor;
End test_reports;

CREATE OR REPLACE PACKAGE BODY test_reports IS

Function cursor_test() return sys_refcursor
Is
fReturn   sys_refcursor;
Begin
     Open fReturn For 
        select '01' Test from dual;
     Return fReturn;
Exception
         When Others Then  Raise;
End cursor_test;

End Test_Reports;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Sub TestOra() 
Dim cmd As ADODB.Command
Dim rs as ADODB.Recordset

    Set cmd = New ADODB.Command
    cmd.ActiveConnection = "Provider=MSDAORA.1; Data Source=test; User ID=test; Password=test"
    cmd.CommandTimeout =  20 
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "test_reports.cursor_test"

    Set rs = cmd.Execute

    Debug.Print rs.Fields( 0 ).Value

    Set rs = Nothing
    Set cmd = Nothing
    
End Sub

вот так попробуйте
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566642
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
...
End test_reports;

не всё исправил
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566723
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не синтаксис непричем
http://www.sql.ru/forum/actualthread.aspx?tid=749216
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566752
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем же людей вводили в заблуждение , что у вас VBA? а оказалось, что у вас ASP
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566756
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тестирую то я в Excel-е...
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566761
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петров АндрейНу тестирую то я в Excel-е...

и такой вариант не прошёл?
...
Рейтинг: 0 / 0
Вызов процедуры Oracle и возврат рекордсета (ADO)
    #36566852
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петров АндрейНу тестирую то я в Excel-е...Не стоит этого делать.
Excel и ASP это очень разные вещи и VB в них только похожий. А все что выходит рамки примитивного синтаксиса уже должно писаться с учетом особенностей сред.
...
Рейтинг: 0 / 0
50 сообщений из 50, показаны все 2 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вызов процедуры Oracle и возврат рекордсета (ADO)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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