powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как вызвать через ADO хранимую процедуру Oracle?
9 сообщений из 9, страница 1 из 1
Как вызвать через ADO хранимую процедуру Oracle?
    #35349537
Фотография superbluesman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМЕЮ ХРАНИМУЮ ПРОЦЕДУРУ на 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
Как вызвать через ADO хранимую процедуру Oracle?
    #35349658
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут почитай: /topic/546309&hl=
...
Рейтинг: 0 / 0
Как вызвать через ADO хранимую процедуру Oracle?
    #35349687
Фотография superbluesman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ссылку ту я посмотрел, дело в том, что там пример хранимой процедуры НЕ возвращает набор записей, как в моём случае, а в моём случае надо в качестве входного-выходного параметра надо использовать 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
Как вызвать через ADO хранимую процедуру Oracle?
    #35349705
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вызвать через ADO хранимую процедуру Oracle?
    #35349707
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
set rs=new adodb.recordset
rs.cursorlocation=aduseclient
rs.open cmd,,adstatic,adreadonly

по памяти ;)
...
Рейтинг: 0 / 0
Как вызвать через ADO хранимую процедуру Oracle?
    #35349742
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
названия параметров неправильно написал :)
Код: 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
Как вызвать через ADO хранимую процедуру Oracle?
    #35349743
Фотография superbluesman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как вызвать через ADO хранимую процедуру Oracle?
    #35349883
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
superbluesmanТак там этот код не ругался, а вот что будет при вызове через ADO...Попробуй - узнаешь. Если твой SQL Navigator не занимается самостоятельной расшифровкой и предкомпиляцией запроса а отдает его как есть серверу на обработку, то значит этот запрос (какой угодно длинный и сложный) может быть скормлен серверу и через ADO.

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

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


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