Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вызов Oracle процедуры через ADO / 13 сообщений из 13, страница 1 из 1
05.04.2005, 16:57
    #32998662
Smollet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
Добрый день!

Возникла такая проблема:

Необходимо вызвать процедуру Oracle из под VB и "забрать" результат выборки, который возвращает процедура.

Ниже листинг с текстом процедуры. В ней выборка возвращается через курсорную переменную:

CREATE OR REPLACE PACKAGE Test_Pac
as
TYPE RetCurType IS REF CURSOR;
END Test_Pac;
/

CREATE OR REPLACE PROCEDURE TEST_sp (Test_Cursor IN OUT Test_Pac.RetCurType)
AS
BEGIN
OPEN Test_Cursor FOR
SELECT * FROM Test_Table;
END;
/

У меня не получается взять результат этой выборки в VB.
Пробую сделать так:

Public Sub Test()
Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset

cnn.Open "DRIVER={ORACLE ODBC DRIVER};SERVER=xxx;UID=xxx;DBQ=xxx;Password=xxx"

Set cmd.ActiveConnection = cnn
cmd.CommandText = "TEST_sp"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Refresh
cmd.CommandTimeout = 0

If rst.State = adStateOpen Then
rst.Close
End If
rst.Open cmd, , adOpenDynamic, adLockBatchOptimistic, adCmdStoredProc

Do Until rst.EOF
'... обработка полученной записи

rst.MoveNext
Loop

rst.Close

Set cnn = Nothing
Set cmd = Nothing
Set rst = Nothing
End Sub

При работе выдает ошибку: "3708 Parameter object is have improperly defined..."

Что делаю не так?

Может кто-то сталкивался уже с такой проблемой или знает другие варианты ее решения (не через курсорную переменную).

Вариант с помещением результата выборки во временную таблицу не годится.
...
Рейтинг: 0 / 0
06.04.2005, 07:52
    #32999317
KuzVit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
Похоже, надо как-то еще параметры определить в коде VB. Пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    Dim Param1 As ADODB.Parameter, Param2 As ADODB.Parameter    
    Set cmd = New ADODB.Command
    Set rsupd = New ADODB.Recordset


' Set up a command object for the stored procedure.
Set cmd.ActiveConnection = cn
cmd.CommandText = "proc_PotokiData_Insert"
cmd.CommandType = adCmdStoredProc

' Set up an input parameter.
Set Param1 = cmd.CreateParameter("DateInp_2", adDate, adParamInput)
Set Param2 = cmd.CreateParameter("Value_3", adDouble, adParamInput)

cmd.Parameters.Append Param1
cmd.Parameters.Append Param2

' Выполняем хранимую процедуру
Set rsupd = cmd.Execute

Может, не проходит объявление переменных cnn, cmd и rst.
Попробуй объявить через Dim без New, а в потом через Set:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim cnn As ADODB.Connection
Dim cmd As ADODB.Command
Dim rst As ADODB.Recordset

....

Set cnn = New ADODB.Connection
Set cmd = New ADODB.Command
Set rst = New ADODB.Recordset
...
Рейтинг: 0 / 0
06.04.2005, 16:11
    #33000938
Guest1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
Этот вопрос нужно задавать в форуме Oracle.
Процедура не может вернуть RecordSet!
Процедура может записать результат в temporary table, а потом можно сделать по ней select.
...
Рейтинг: 0 / 0
07.04.2005, 13:37
    #33002612
Barsss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
...
Рейтинг: 0 / 0
07.04.2005, 13:41
    #33002624
Barsss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
вот кусочек кода все рабочее только что вырезал из програмы
Подключение через системный ODBC

Public ADOcon As ADODB.Connection
Dim ADOconUs As ADODB.Connection, rst As ADODB.Recordset

Set ADOcon = New ADODB.Connection
ADOcon.ConnectionTimeout = 0
ADOcon.Open "reg", "reg", "reg"
Set rst = ADOcon.Execute("select distinct VALUE from REG_CDB_PAR where REG_CDB_PAR.Code like 'NAME_DC_RV'and REG_CDB_PAR.Owner like 'R2%'")
While (Not rst.EOF)
If rst(0) = "" Then MsgBox "Связь с БД отсутствует"
If rst(0) = "" Then GoTo kin
Label4.Caption = rst(0)
rst.MoveNext
Wend
...
Рейтинг: 0 / 0
07.04.2005, 14:38
    #33002773
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
Вот пример пакета для использования с VB

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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;

а это как все выше написанное можно вызвать:

Код: 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.
43.
44.
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

 111      SQL = "{call SCOTT.CUST.GETCLIENTINFO(?,{resultset 0, io_cursor})}"

 113     dDate = mProcessData.TransDate
    
 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
 172     mProcessData.TransDate = p("p_date").Value
 170     Set rs.ActiveConnection = Nothing
 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"
    Resume lb_out
    
End Function
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
30.06.2015, 15:07
    #38996041
Gabit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
Доброе время суток !

Необходимо вызвать функции из базы Oracle через ADO (OLE DB):
Код: plsql
1.
CREATE OR REPLACE FUNCTION FUNC1 (par1    IN NUMBER) RETURN CHAR



Работоспособность функции проверена через sql+:
Код: plsql
1.
2.
3.
begin
	dbms_output.put_line(FUNC1(par1=>1));
end;


Отрабатывает без ошибок.


Теперь его из VBA вызываю так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    ...
    CMD.CommandText = "FUNC1"
    CMD.Parameters.Append CMD.CreateParameter("RETURN_VALUE", adVarChar, adParamReturnValue)
    CMD.Parameters.Append CMD.CreateParameter("par1", adVarNumeric, adParamInput)

    CMD.CommandType = adCmdStoredProc
    CMD.Parameters("par1").Value = 1

    CMD.Execute
    
    MsgBox (CMD.Parameters("RETURN_VALUE").Value)



выдает ошибку - 3708 : Неправильно определен объект Parameter. Предоставлены несогласованные или неполные сведения.

На этой строке:
Код: vbnet
1.
    CMD.Parameters.Append CMD.CreateParameter("RETURN_VALUE", adVarChar, adParamReturnValue)



Попробовал так:
Код: vbnet
1.
    CMD.Parameters.Append CMD.CreateParameter("RETURN_VALUE", adBSTR, adParamReturnValue)



Но в этом случае получаю ошибку:
Run-time error '-2147217900 (80040e14):
ORA-06502: PL/SQL: : буфер символьных строк слишком маленький ошибка числа или значения.


Как решить проблему ?
...
Рейтинг: 0 / 0
01.07.2015, 12:18
    #38996733
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
задать размер у параметра
...
Рейтинг: 0 / 0
01.07.2015, 13:22
    #38996832
гр к
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
А это вообще нормально, задавать CMD.CommandType = adCmdStoredProc и при этом пытаться использовать функцию?
Никогда раньше такого не видел. Думал, что только имя хранимки можно, а не ф-ии.
...
Рейтинг: 0 / 0
07.07.2015, 12:51
    #39001324
Gabit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
Konst_Oneзадать размер у параметра
Где и как ?
...
Рейтинг: 0 / 0
07.07.2015, 12:51
    #39001325
Gabit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
гр кА это вообще нормально, задавать CMD.CommandType = adCmdStoredProc и при этом пытаться использовать функцию?
Никогда раньше такого не видел. Думал, что только имя хранимки можно, а не ф-ии.
Функция тоже хранимая.
Для него есть другой тип ?
...
Рейтинг: 0 / 0
07.07.2015, 13:07
    #39001363
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
Gabitгр кА это вообще нормально, задавать CMD.CommandType = adCmdStoredProc и при этом пытаться использовать функцию?
Никогда раньше такого не видел. Думал, что только имя хранимки можно, а не ф-ии.
Функция тоже хранимая.
Для него есть другой тип ?
вообще-то функция вызывается не как хранимая процедура, а как часть запроса.
для такого случая есть тип команды adCmdSQLText
и строка запроса должна быть типа
Код: sql
1.
SELECT FUNC1(PAR1) FROM DUAL




PS: за синтаксис не отвечаю, т.к с ораклом работал мало
...
Рейтинг: 0 / 0
09.07.2015, 05:45
    #39003011
Gabit
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вызов Oracle процедуры через ADO
Спасибо, попробую.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вызов Oracle процедуры через ADO / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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