Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Код на С++ вроде правильный... КД>Может это, для начала напишешь и заставишь работать маленький тест на 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)
И все равно получаю ту же ошибку.
Может проблема не в 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
Здравствуйте!
Нужна помощь в связи с проблемой — при передаче массива в хранимую процедуру получаю Unspecified Error
Как правильно работать с массивами через ADO? Какие есть тонкости?
Дополнительная информация:
версия Oracle 9i, ADO 2.7
тип массива в Oracle
CREATE TYPE V10 AS VARRAY(10) OF INTEGER
есть хранимая процедура, которая принимает параметр типа V10
(arr IN V10)
При выполнении OraCommand->Execute получаю Unspecified Error
В самом теле процедурі ошибки быть не может, так как пробовал сократить ее до минимума — оставить один заведомо правильный оператор. Все остальное тоже похоже правильно, так как без этого параметра все работает. Так что проблема в передаче параметра.
Как говорится — теория правильная, а коммунизма нет:)
Кто знает, как сделать это правильно, пожалуйста подскажите
Заранее благодарен всем, кто откликнется.
Re: Передача массивов в хранимую процедуру Oracle через ADO
Здравствуйте, 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
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Кажись ты передаешь не правильный размер параметра. КД>Параметры в OLEDB провайдер передаются как SAFEARRAY*, то бишь размер должен быть 4 байта.
КД>А лучше забить, и передавать в качестве размера -1. ADO должно само разобраться.
Я попробовал передавать размер 4 и -1 — все равно стабильно получаю ту же ошибку Unspecified Error
Re[3]: Передача массивов в хранимую процедуру Oracle через A
Здравствуйте, Igor_from_Kiev, Вы писали:
IFK>Здравствуйте, Коваленко Дмитрий, Вы писали:
IFK>Я попробовал передавать размер 4 и -1 — все равно стабильно получаю ту же ошибку Unspecified Error
Код на С++ вроде правильный...
Может это, для начала напишешь и заставишь работать маленький тест на VB ?
С массивами ADO (начиная с 2.5) работает без проблем.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Передача массивов в хранимую процедуру Oracle через ADO
Здравствуйте, 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
Столкнулся с аналогичной проблемой (VC+ADO+Oracle: передача объектной таблицы в качестве параметра). Очень хотелось бы узнать: удалось это сделать кому-либо и как? Особенно удивляет отсуствие информации на эту тему в фирменной документации Oracle а также крайне малое количество примеров на http://otn.oracle.com/sample_code/tech/windows/ole_db/content.html, есть только работа с LOB.
Огромная просьба: если все кто-то выяснил как это делать, выложите пример на форум!