как вернуть oracle recordset в ADO

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

как вернуть oracle recordset в ADO

Сообщение Konst_One » 19.05.2004 (Ср) 12:44

Проблемка возникла с получением рекордсета из оракловой процедуры.

Вот пакет оракловый:
Код: Выделить всё
create or replace package CUST as
  --
  type t_set_tbl is ref cursor;
  function getint return integer;
  procedure GETCLIENTINFO (t_set out t_set_tbl);
  --
end CUST;
/

create or replace package body CUST as
  function getint return integer
  is
  begin
       return(23);
  end getint;
 
  procedure GETCLIENTINFO (t_set out t_set_tbl)
  is
    v_result_set t_set_tbl;
  begin
    open v_result_set for
         select * from emp;
    --
    t_set:=v_result_set;
  end GETCLIENTINFO;
  --
end CUST;
/


а вот вызов:
Код: Выделить всё
SQL = "{call cust.getclientinfo({resultset 9, t_set})}"

Set cmd = New ADODB.Command
Set cmd.ActiveConnection = CN_ORA
cmd.CommandTimeout = 20
cmd.CommandType = adCmdText
cmd.CommandText = SQL

set rs=cmd.execute



а вот ответ:

[-2147217900 'ORA-06550: Строка 1, столбец 35:
PLS-00201: идентификатор 'T_SET' должен быть объявлен
ORA-06550: Строка 1, столбец 7:
PL/SQL: Statement ignored']


Есть у кого какие идеи?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.05.2004 (Ср) 12:57

Разве должно быть не adCmdStoredProc?
Кроме того, ты видимо опечатался (пропустил запятую), когда приводил пакадж, в описании у него один аргумент, а вызываешь ты его с двумя.
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 19.05.2004 (Ср) 13:19

Большой человек подскажи как надо тогда вызвать, что то я совсем запутался.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 19.05.2004 (Ср) 14:20

всем спасибо уже разобрался

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.05.2004 (Ср) 14:46

Так поделись :)
Дело было в adCmdStoredProc или нет?
Lasciate ogni speranza, voi ch'entrate.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 19.05.2004 (Ср) 15:07

Кое что поменял в описании процедуры

Код: Выделить всё
create or replace package CUST as
  --
   TYPE t_cursor IS REF CURSOR ;
   Procedure GETCLIENTINFO (p_date in out date, io_cursor IN OUT t_cursor);
  --
end CUST;
/

create or replace package body CUST as
 
Procedure GETCLIENTINFO (p_date in out date, io_cursor IN OUT t_cursor)
IS
   v_cursor t_cursor;
BEGIN
      OPEN v_cursor FOR
      SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME
         FROM EMP, DEPT
         WHERE EMP.DEPTNO = DEPT.DEPTNO;
   io_cursor := v_cursor;
END GETCLIENTINFO;
  --
end CUST;
/



а это вызов:

Код: Выделить всё

Public Function GetTransactions() As ADODB.Recordset
On Error GoTo err_debug
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Dim p As ADODB.Parameters
Dim ErrNumber As String
Dim ErrDesc As String
Dim ErrLine As Long
Dim dDate As Date
Dim SQL As String

        SQL = "{call cust.getclinetinfo(?,{resultset 0, io_cursor})}"

        If Len(Me.TransDate) > 0 Then
            dDate = CDate(Me.TransDate)
        End If
   
100    Set cmd = New ADODB.Command
130    Set cmd.ActiveConnection = CN_ORA
       cmd.CommandTimeout = 20
110    cmd.CommandType = adCmdText
120    cmd.CommandText = SQL
               
131    Set p = cmd.Parameters
134    p.Append cmd.CreateParameter("p_date"), adDBTimeStamp, adParamInputOutput, , dDate)

140    Set rs = New ADODB.Recordset
150    rs.CursorLocation = adUseClient
160    rs.Open cmd, , adOpenStatic, adLockReadOnly
170    Set rs.ActiveConnection = Nothing
172    Me.TransDate = p("p_date").Value
180    Set GetTransactions = rs
   
lb_out:
    Set rs = Nothing
    Set cmd = Nothing
    Set p = Nothing
    Exit Function
   
err_debug:
    ErrNumber = Err.Number
    ErrDesc = Err.Description
    ErrLine = Erl
    LogError "GetTransactions"
    MsgBox ErrNumber & ": " & ErrDesc & " on line " & ErrLine, vbCritical
    Resume lb_out
   
End Function


Все теперь работает.
Главное надо не забыть юзать мелкософтовский OLEDB провайдер для оракла.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 19.05.2004 (Ср) 15:08

в вызове, когда писал ошибся в названии процедуры:

Код: Выделить всё
cust.getclinetinfo


надо конечно:

Код: Выделить всё
cust.getclientinfo

:lol:


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList