TOraStoredProc (dbms_output.get_lines)

Обсуждение возникших проблем, предложений и ошибок ODAC компонентов

Ответить
petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

TOraStoredProc (dbms_output.get_lines)

Сообщение petrel » Вт 07 ноя 2017 08:36

Доброе время суток.

ODAC 10.1.3
ORA-02005: implicit (-1) length not valid for this bind or define datatype

OraSession1->ExecSQL("call dbms_output.enable( 20000 )" );
int NumLines = 1;

TOraStoredProc *OraStoredProc = new TOraStoredProc(this);
OraStoredProc->Session = OraSession1;

OraStoredProc->StoredProcName = "dbms_output.get_lines";
OraStoredProc->Prepare();
OraStoredProc->ParamByName("LINES")->Length = NumLines;
OraStoredProc->ParamByName("NUMLINES")->AsInteger = OraStoredProc->ParamByName("LINES")->Length;

/////------Действия на стороне сервера--------------


try {
OraStoredProc->ExecProc();
} catch (Exception &exception) {
//// -------------- ORA-02005: implicit (-1) length not valid for this bind or define datatype --------
Application->ShowException(&exception);
return;
}

Что необходимо подкорректировать для извлечения сообщений ?

MaximG
Devart Team
Сообщения: 99
Зарегистрирован: Пн 06 июл 2015 12:51

Re: TOraStoredProc (dbms_output.get_lines)

Сообщение MaximG » Ср 08 ноя 2017 12:38

Мы проверили приведенный Вами фрагмент кода и не обнаружили проблем. Результаты работы dbms_output.get_lines мы успешно отобразили в TMemo, заменив в Вашем коде строку

Код: Выделить всё

 /////------Действия на стороне сервера-------------- 
на

Код: Выделить всё

Memo->Lines->Add(OraStoredProc->ParamByName("LINES")->AsString);
Попробуйте проверить работу данного фрагмента кода в своем окружении. В случае возникновения ошибки ORA-02005, пожалуйста, составьте и пришлите нам небольшой полный пример, при выполнении которого проблема проявляет себя. Это удобно сделать с помощью формы e-support : ( https://www.devart.com меню "Support"\"Request Support" )

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: TOraStoredProc (dbms_output.get_lines)

Сообщение petrel » Ср 08 ноя 2017 13:20

Это и был полный текст примера.
Для уточнения:
ODAC 10.1.3
client Oracle 11.2.0.3.0
Windows 7 Service Pack 1

В прикрепленном архиве готовый проект и выполняемый файл.
Вложения
OraStoredProc.zip
(18.45 КБ) 149 скачиваний

MaximG
Devart Team
Сообщения: 99
Зарегистрирован: Пн 06 июл 2015 12:51

Re: TOraStoredProc (dbms_output.get_lines)

Сообщение MaximG » Ср 08 ноя 2017 16:41

Спасибо за Вашу информацию. В нашем предыдущем ответе закралась небольшая неточность. Естественно вызов Memo->Lines->Add(OraStoredProc->ParamByName("LINES")->AsString); мы разместили после выполнения метода ExecProc:

Код: Выделить всё

OraStoredProc->ExecProc();
    Memo->Lines->Add(OraStoredProc->ParamByName("LINES")->AsString);
Мы добавили в Ваш проект следующий код :

Код: Выделить всё

OraSession1->ExecSQL("BEGIN dbms_output.put_line('Test'); END;");
после чего, получили в Memo значение 'Test', возвращаемое методом DBMS_OUTPUT.Get_Lines

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: TOraStoredProc (dbms_output.get_lines)

Сообщение petrel » Чт 09 ноя 2017 07:04

В оболочке, после нажатия кнопки 'Execute'
[img]
ORA-02005_ODAC.jpg
ORA-02005_ODAC.jpg (102.95 КБ) 6572 просмотра
[/img]

MaximG
Devart Team
Сообщения: 99
Зарегистрирован: Пн 06 июл 2015 12:51

Re: TOraStoredProc (dbms_output.get_lines)

Сообщение MaximG » Пт 10 ноя 2017 16:22

Мы проверили работу ODAC в точности согласно Вашему описанию. К сожалению нам не удалось воспроизвести данную проблему. При нажатии на кнопку Execute в RAD Studio мы успешно выполнили вызов DBMS_Output.Get_Lines

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: TOraStoredProc (dbms_output.get_lines)

Сообщение petrel » Ср 15 ноя 2017 11:44

[img]
OraStoredProc.jpg
OraStoredProc.jpg (56.48 КБ) 6551 просмотр
[/img]

Если Size заменить на 3999 - то работает.

В нашей предыдущей версии работало и с 32767.

Как правильно поступать с этим параметром ?
Или что поменять в настройках Oracle ?

MaximG
Devart Team
Сообщения: 99
Зарегистрирован: Пн 06 июл 2015 12:51

Re: TOraStoredProc (dbms_output.get_lines)

Сообщение MaximG » Пн 04 дек 2017 11:54

Мы изменили присланный Вами пример с тем, чтобы использовать размер параметра LINES, равным 32767. Мы успешно выполнили вызов DBMS_Output.Get_Lines с данными изменениями в своем тестовом окружении. Проверьте работоспособность такого примера и сообщите нам о результатах. Измените исходный код примера таким образом, чтобы ошибка ORA-02005
проявила себя.
Вложения
DevartOraStoredProc.zip
(6.86 КБ) 106 скачиваний

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: TOraStoredProc (dbms_output.get_lines)

Сообщение petrel » Чт 07 дек 2017 09:47

Если ни чего не менять тогда:
'ORA-02005: implicit (-1) length not valid for this bind or define datatype'.

Если заменить:
OraStoredProc->ParamByName("LINES")->Size = 32767;
на
OraStoredProc->ParamByName("LINES")->Size = 3999;

'ORA-06502: PL/SQL: numeric or value error: host bind array too small'
'ORA-06512: at line 2'


У нас есть:
SYS.DBMS_OUTPUT.GET_LINES Как таковой нет
SYS.DBMS_OUTPUT.GET_LINES:1 Parametr: 'LINES'-string 'NUMLINES'-float
SYS.DBMS_OUTPUT.GET_LINES:2 Parametr: 'LINES'-Object 'NUMLINES'-float

P.S.
where field1=:param1
-----в предыдущей версии ODAC 9.3.9 если-----
param1 == Null запрос срабатывал.
-----в новой 10.1.3 версии пришлось разделить-----
if( :param1.isNull ) where field1 is null
else where field1=:param1

MaximG
Devart Team
Сообщения: 99
Зарегистрирован: Пн 06 июл 2015 12:51

Re: TOraStoredProc (dbms_output.get_lines)

Сообщение MaximG » Ср 27 дек 2017 14:37

Мы продолжаем выяснение причин, которые могут приводить к описываемой Вами ошибке. Мы сообщим Вам о результатах, как только получим их

Ответить