Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как вызвать через ADO хранимую процедуру Oracle? / 9 сообщений из 9, страница 1 из 1
02.06.2008, 16:40
    #35349537
superbluesman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать через ADO хранимую процедуру Oracle?
ИМЕЮ ХРАНИМУЮ ПРОЦЕДУРУ на Oracle 9 (в Oracle я новичок, потребности бизнес-задач заставили):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or replace package ane_pack_1 is
    type t_refcursor_1 is ref cursor;
     procedure my_proc_1(out_data in out sys_refcursor, p_param1 IN number);
  end ane_pack_1;



create or replace package body ane_pack_1 
is

PROCEDURE my_proc_1(out_data in out sys_refcursor
            		   ,p_param1 IN number)
is
begin
	open out_data for select rownum from user_objects where rownum<=p_param1;
end my_proc_1;
    
end ane_pack_1 ;




Этот код прописан в макросе Excel-я:
Код: 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.
38.
39.
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset

    
With cnt
  .Provider = "MSDAORA"
  .ConnectionString = "Data Source=dwh;User ID=ddd;Password=ddd"
  .CursorLocation = adUseClient
  .Open
End With


Set cmd = New ADODB.Command
Set rs = CreateObject("ADODB.Recordset")
With cmd
  .ActiveConnection = cnt
'  простой селект работает:
  .CommandType = adCmdText
  .CommandText = "SELECT * FROM dwh.testTable"

' А что нужно ПРОПИСАТЬ, ЧТОБЫ ВЫВЗЫВАТЬ ЩРАКЛОВУЮ ХРАНИМУЮ ПРОЦЕДУРУ my_proc_1
End With
           
Set rs = cmd.Execute

Dim i, j As Long
j = rs.RecordCount
rs.MoveFirst
For i =  0  To j -  1 
  Sheets( 1 ).Cells(i +  1 ,  1 ) = i
  Sheets( 1 ).Cells(i +  1 ,  2 ) = rs.Fields("name")
  rs.MoveNext
Next
rs.Close

Set cmd = Nothing
cnt.Close
Set cnt = Nothing
End Sub

Помогите!!
...
Рейтинг: 0 / 0
02.06.2008, 17:16
    #35349658
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать через ADO хранимую процедуру Oracle?
тут почитай: /topic/546309&hl=
...
Рейтинг: 0 / 0
02.06.2008, 17:29
    #35349687
superbluesman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать через ADO хранимую процедуру Oracle?
Ссылку ту я посмотрел, дело в том, что там пример хранимой процедуры НЕ возвращает набор записей, как в моём случае, а в моём случае надо в качестве входного-выходного параметра надо использовать sys_refcursor.....

применрно как-то так в SQL-Navigatore выглядит вызов:

Код: plaintext
1.
2.
3.
4.
declare c sys_refcursor;
begin
  ane_pack_1.my_proc_1(c,  100 );
end;
...
Рейтинг: 0 / 0
02.06.2008, 17:34
    #35349705
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать через ADO хранимую процедуру Oracle?
superbluesman
применрно как-то так в SQL-Navigatore выглядит вызов:

Код: plaintext
1.
2.
3.
4.
declare c sys_refcursor;
begin
  ane_pack_1.my_proc_1(c,  100 );
end;
Вот этот код работает? Тогда, прямо так как он тут показан, и запихай его в свою cmd.CommandText. Не забудь что это многострочный текст и переводы строк тоже важны.
...
Рейтинг: 0 / 0
02.06.2008, 17:35
    #35349707
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать через ADO хранимую процедуру Oracle?
Код: plaintext
1.
2.
set rs=new adodb.recordset
rs.cursorlocation=aduseclient
rs.open cmd,,adstatic,adreadonly

по памяти ;)
...
Рейтинг: 0 / 0
02.06.2008, 17:45
    #35349742
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать через ADO хранимую процедуру Oracle?
названия параметров неправильно написал :)
Код: plaintext
rs.Open cmd, , adOpenStatic, adLockReadOnly


oracle package (с сокращениями, но и так все понятно):

Код: 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.
38.
39.
40.
41.
42.
--whenever sqlerror exit rollback
create or replace package cust_p as
  --
  -- Тип возвращаемых данных
  type t_set is record (
    ClientName        varchar2( 60 ),
    Login             varchar2( 16 ),
    Phone             varchar2( 15 )
  );
  type t_set_tbl is ref cursor return t_set;

  function GetClientInfo(p_date in out date) return t_set_tbl;
  --
  -- Закрытие курсора
  procedure Close(p_ref_cursor in t_set_tbl);
  --
end cust_p;
/


create or replace package body cust_p as
  function GetClientInfo(p_date in out date) return t_set_tbl is
    v_result_set t_set_tbl;
  begin
    open v_result_set for
      select 'Test Client' ClientName
            ,'123' Login
            ,'+79161234567' Phone
        from dual;
    --
    return v_result_set;
  end GetClientInfo;
  --
  -- Закрытие курсора
  procedure Close(p_ref_cursor in t_set_tbl) is
  begin
    if p_ref_cursor%isopen then
      close p_ref_cursor;
    end if;
  end Close;
  --
end cust_p;
/
...
Рейтинг: 0 / 0
02.06.2008, 17:46
    #35349743
superbluesman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать через ADO хранимую процедуру Oracle?
To White Owl:

Код: plaintext
1.
2.
3.
4.
declare c sys_refcursor;
begin
  ane_pack_1.my_proc_1(c,  100 );
end;
код этот запускал в тулзе для Oracle, которая называется SQL Navigator. Так там этот код не ругался, а вот что будет при вызове через ADO...
А как переводить на новую строку
Код: plaintext
 & vbNewLine
или как ?
...
Рейтинг: 0 / 0
02.06.2008, 18:38
    #35349883
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать через ADO хранимую процедуру Oracle?
superbluesmanТак там этот код не ругался, а вот что будет при вызове через ADO...Попробуй - узнаешь. Если твой SQL Navigator не занимается самостоятельной расшифровкой и предкомпиляцией запроса а отдает его как есть серверу на обработку, то значит этот запрос (какой угодно длинный и сложный) может быть скормлен серверу и через ADO.

superbluesmanА как переводить на новую строку
Код: plaintext
 & vbNewLine
или как ?Или vbNewLine, или CHR(13) или CHR(13)&CHR(10) или даже CHR(32), но последнее зависит от того насколько умный парсер у сервера. Пробуй.
...
Рейтинг: 0 / 0
03.06.2008, 09:07
    #35350350
superbluesman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать через ADO хранимую процедуру Oracle?
вообщем здесь расписан ответ на мой вопрос

http://forums.devx.com/archive/index.php/t-17552.html
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как вызвать через ADO хранимую процедуру Oracle? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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