Re[4]: Передача массивов в хранимую процедуру Oracle через A
От: Igor_from_Kiev Украина  
Дата: 07.02.03 11:06
Оценка: 1 (1)
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Код на С++ вроде правильный...

КД>Может это, для начала напишешь и заставишь работать маленький тест на VB ?
КД>С массивами ADO (начиная с 2.5) работает без проблем.

Написал новую хранимую процедуру WRITE_BSTR_ARRAY
И код ее вызова на VB

Dim OraConn As Connection
Set OraConn = New Connection
OraConn.CursorLocation = adUseClient
OraConn.Open "Provider=OraOLEDB.Oracle;Data Source=second;PLSQLRSet=1;", "PUMA", "puma", 0
Dim OraCommand As Command
Set OraCommand = New Command
OraCommand.ActiveConnection = OraConn
OraCommand.CommandText = "WRITE_BSTR_ARRAY"

Dim pprmBinaryVal As Parameter
Dim arrVal(0 To 9) As String
'пробовал также Dim arrVal(1 To 10) As String

Dim x As Long

For x = LBound(arrVal) To UBound(arrVal)
arrVal(x) = CStr(x) & ":" & CStr(Time)
Next x


Set pprmBinaryVal = OraCommand.CreateParameter("mas", adArray + adBSTR, adParamInput)


OraCommand.Parameters.Append pprmBinaryVal
pprmBinaryVal.Value = arrVal


OraCommand.Execute , , adCmdStoredProc


И все равно получаю ту же ошибку.
Может проблема не в C++ и VB, а в Oracle?
Я с ним недавно работаю и может не знаю как там правильно с массивами работать
Но я пробовал даже самую простую хр. процедуру, где сам массив даже не используется.
Описание типа
CREATE TYPE "PUMA"."VBSTR" AS VARRAY (10) OF VARCHAR2(255)

процедура

CREATE OR REPLACE PROCEDURE "PUMA"."WRITE_BSTR_ARRAY" (mas
IN VBSTR)
IS
BEGIN
UPDATE PUMA.TEST_ARRAY SET iid = 0;
END WRITE_BSTR_ARRAY;

Может, проблема в неправильной работе с Oracle?
Передача массивов в хранимую процедуру Oracle через ADO
От: Igor_from_Kiev Украина  
Дата: 07.02.03 09:57
Оценка:
Здравствуйте!
Нужна помощь в связи с проблемой — при передаче массива в хранимую процедуру получаю Unspecified Error
Как правильно работать с массивами через ADO? Какие есть тонкости?

Дополнительная информация:
версия Oracle 9i, ADO 2.7
тип массива в Oracle
CREATE TYPE V10 AS VARRAY(10) OF INTEGER
есть хранимая процедура, которая принимает параметр типа V10
(arr IN V10)

часть кода на C++:


        _ParameterPtr pprmBinaryVal = NULL;
        VARIANT vtBinaryVal;
        VariantInit(&vtBinaryVal);
        vtBinaryVal.vt = VT_ARRAY|VT_I4;

        SAFEARRAY FAR *psa;
        SAFEARRAYBOUND rgsabound[1];
        rgsabound[0].lLbound = 0;
        rgsabound[0].cElements = 10;
        psa = SafeArrayCreate(VT_I4, 1,rgsabound);
        long ix[1];
        for(int k=0; k<10; k++)
        {
            ix[0] = k;
            long lVal = k;
            SafeArrayPutElement(psa,ix,&lVal); 
        }

        vtBinaryVal.parray = psa;

        
        int n = 10*SafeArrayGetElemsize(psa);
        pprmBinaryVal = OraCommand->CreateParameter("arr",(enum DataTypeEnum)(adArray|adInteger),adParamInput,n,vtBinaryVal);
        
        OraCommand->Parameters->Append(pprmBinaryVal);
        
        pprmBinaryVal->Value = vtBinaryVal;
              
        OraCommand->Execute(&vtEmpty, &vtEmpty2, adCmdStoredProc);



При выполнении OraCommand->Execute получаю Unspecified Error
В самом теле процедурі ошибки быть не может, так как пробовал сократить ее до минимума — оставить один заведомо правильный оператор. Все остальное тоже похоже правильно, так как без этого параметра все работает. Так что проблема в передаче параметра.
Как говорится — теория правильная, а коммунизма нет:)

Кто знает, как сделать это правильно, пожалуйста подскажите
Заранее благодарен всем, кто откликнется.
Re: Передача массивов в хранимую процедуру Oracle через ADO
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 07.02.03 10:07
Оценка:
Здравствуйте, Igor_from_Kiev, Вы писали:

IFK> int n = 10*SafeArrayGetElemsize(psa);

IFK> pprmBinaryVal = OraCommand->CreateParameter("arr",(enum DataTypeEnum) (adArray|adInteger),adParamInput,n,vtBinaryVal);

Кажись ты передаешь не правильный размер параметра.
Параметры в OLEDB провайдер передаются как SAFEARRAY*, то бишь размер должен быть 4 байта.

А лучше забить, и передавать в качестве размера -1. ADO должно само разобраться.

Можешь посмотреть здесь как через ADO передаются массивы в InterBase.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: Передача массивов в хранимую процедуру Oracle через A
От: Igor_from_Kiev Украина  
Дата: 07.02.03 10:29
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Кажись ты передаешь не правильный размер параметра.

КД>Параметры в OLEDB провайдер передаются как SAFEARRAY*, то бишь размер должен быть 4 байта.

КД>А лучше забить, и передавать в качестве размера -1. ADO должно само разобраться.


Я попробовал передавать размер 4 и -1 — все равно стабильно получаю ту же ошибку Unspecified Error
Re[3]: Передача массивов в хранимую процедуру Oracle через A
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 07.02.03 10:40
Оценка:
Здравствуйте, Igor_from_Kiev, Вы писали:

IFK>Здравствуйте, Коваленко Дмитрий, Вы писали:


IFK>Я попробовал передавать размер 4 и -1 — все равно стабильно получаю ту же ошибку Unspecified Error


Код на С++ вроде правильный...
Может это, для начала напишешь и заставишь работать маленький тест на VB ?
С массивами ADO (начиная с 2.5) работает без проблем.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Передача массивов в хранимую процедуру Oracle через ADO
От: VVP Россия 67524421
Дата: 07.02.03 10:51
Оценка:
Здравствуйте, Igor_from_Kiev, Вы писали:

IFK>тип массива в Oracle

IFK>CREATE TYPE V10 AS VARRAY(10) OF INTEGER
Попробуй объявить тип, именно тип в оракле, так:
CREATE TYPE V10 IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

Принципы внутреннего хранения VARRAY и TABLE OF различаются. К тому же попробуй вместо INTEGER использовать NUMBER, а массив на клиенте заполнять не данными целого типа, а веществеными.
Я конечно понимаю, что все это полумеры, но большего не знаю. Есть еще одна идея — просмотри примеры от оракла, они лежат в каталоге, где у тебя инсталлирован клиент оракла, тем более если устанавливал клиента в программистской конфигурациию
Никогда не бойся браться делать то, что делать не умеешь. Помни, ковчег был построен любителем. Профессионалы построили Титаник...
Re[5]: Передача массивов в хранимую процедуру Oracle через A
От: Finder  
Дата: 25.06.03 13:29
Оценка:
Столкнулся с аналогичной проблемой (VC+ADO+Oracle: передача объектной таблицы в качестве параметра). Очень хотелось бы узнать: удалось это сделать кому-либо и как? Особенно удивляет отсуствие информации на эту тему в фирменной документации Oracle а также крайне малое количество примеров на http://otn.oracle.com/sample_code/tech/windows/ole_db/content.html, есть только работа с LOB.

Огромная просьба: если все кто-то выяснил как это делать, выложите пример на форум!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.