powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно выполнить процедуру из пакета Oracle 9 в программе на С++ ?
9 сообщений из 9, страница 1 из 1
Как правильно выполнить процедуру из пакета Oracle 9 в программе на С++ ?
    #34658486
Не понимаю в чем ошибка ...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CDatabase cdb;

if ( cdb.OpenEx("DRIVER={Microsoft ODBC for Oracle};SERVER=MYSERVER;UID=MYUSER;PWD=MYPASS", CDatabase::noOdbcDialog) !=  0  )
{

    try 
    {
        cdb.ExecuteSQL("BEGIN MYPACKAGE.INSERT_RECORD('ИВАНОВ') END;");  //1-ОШИБКА
        cdb.ExecuteSQL("MYPACKAGE.INSERT_RECORD('ИВАНОВ')");                  //2-ОШИБКА
        cdb.ExecuteSQL("INSERT INTO MYTABLE (COLUMN1) VALUES ('ИВАНОВ')");   //3-все работает
    }
    catch (CException* myException) 
    {
        AfxMessageBox("EXCEPTION: Ошибка выполнения запроса.", MB_OK | MB_ICONERROR );	
    }

}

Как правильно выполнить процедуру из пакета Oracle 9 в программе на С++ ?
(если в SQL Navigator 5.0 все три варианта работают без ошибок)

Очень нужно выполнить именно - процедуру из пакета Oracle,
а не команды типа INSERT, UPDATE и т.д. (т.е. не просто SQL, а PL/SQL)
но если кто подскажет функцию из пакета (с возвращаемым значением) то еще лучше.

ПОМОГИТЕ !!!
...
Рейтинг: 0 / 0
Как правильно выполнить процедуру из пакета Oracle 9 в программе на С++ ?
    #34658518
Тынц.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdb.ExecuteSQL("BEGIN MYPACKAGE.INSERT_RECORD('ИВАНОВ'); END;");
...
Рейтинг: 0 / 0
Как правильно выполнить процедуру из пакета Oracle 9 в программе на С++ ?
    #34658740
Да, была описка (пропустил точку с запятой).
Этот запрос ошибки не дает
Код: plaintext
cdb.ExecuteSQL("BEGIN MYPACKAGE.INSERT_RECORD('ИВАНОВ'); END;");

но и не выполняется - программа уходит в дикое ожидание, как и при

Код: plaintext
cdb.ExecuteSQL("INSERT INTO MYTABLE (COLUMN1) VALUES ('ИВАНОВ');");

в последней строке все правильно с точки зрения Oracle,
но с точки зрения C++ (или ODBC) по-видимому нет
(не нравится наличие любого вхождения точки с запятой)
...
Рейтинг: 0 / 0
Как правильно выполнить процедуру из пакета Oracle 9 в программе на С++ ?
    #34658743
запрос с точкой с запятой не выполняется на сервере
и программа на С++ дальше этой строки не выполняется тож.

Ошибок никаких не диагностируется.
...
Рейтинг: 0 / 0
Как правильно выполнить процедуру из пакета Oracle 9 в программе на С++ ?
    #34658746
может кто знает почему "DRIVER={Microsoft ODBC for Oracle}" не любит точку с запятой
или он не поддерживает PL/SQL
...
Рейтинг: 0 / 0
Как правильно выполнить процедуру из пакета Oracle 9 в программе на С++ ?
    #34658800
Тынц.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ищу помощь ...может кто знает почему "DRIVER={Microsoft ODBC for Oracle}" не любит точку с запятой
или он не поддерживает PL/SQL
Через ODBC c Ораклом не работал, не знаю, насколько адекватен майкрософтовский драйвер... Но посоветую всё-таки взять родной: http://www.oracle.com/technology/software/tech/windows/odbc/index.html

А чтобы определить причину "зависания", можно посмотреть, что именно выполняется в рамках сессии, например так: http://www.sql.ru/faq/faq_topic.aspx?fid=389 или любым SQL Monitor'ом ...
...
Рейтинг: 0 / 0
Как правильно выполнить процедуру из пакета Oracle 9 в программе на С++ ?
    #34660347
Заработало !!!
Код: plaintext
cdb.ExecuteSQL("BEGIN MYPACKAGE.INSERT_RECORD('ИВАНОВ'); END;");

Это было не ожидание, а ОЧЕНЬ-ОЧЕНЬ медленное выполнение ;-)

Реально у процедуры было около десятка параметров, а в таблице около 900 тыс.строк,
а при добавлении КАЖДОЙ строки (а их было около тысячи),
проверялось есть-ли строка с такими значениями,
если нет - то добавлялась, если есть - то изменялся один из столбцов в этой строке.



2 Тынц. СПАСИБО !
...
Рейтинг: 0 / 0
Как правильно выполнить процедуру из пакета Oracle 9 в программе на С++ ?
    #34660559
Тынц.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ищу помощь ...
Это было не ожидание, а ОЧЕНЬ-ОЧЕНЬ медленное выполнение ;-)

Реально у процедуры было около десятка параметров, а в таблице около 900 тыс.строк,
а при добавлении КАЖДОЙ строки (а их было около тысячи),
проверялось есть-ли строка с такими значениями,
если нет - то добавлялась, если есть - то изменялся один из столбцов в этой строке.

http://ln.com.ua/~openxs/projects/oracle/ora049.html

И ещё, по поводу
Код: plaintext
cdb.ExecuteSQL("BEGIN MYPACKAGE.INSERT_RECORD('ИВАНОВ'); END;");
Надеюсь, в рабочем коде там всё-таки параметр в вызове функции, а не константы для каждой строки... Если константы, то надо почитать, чем грозит неиспользование (когда нужно) связываемых переменных. Можно, например, у Кайта http://c-books.info/oracle или хотя бы почитать обсуждения этой проблемы в ветке Oracle: http://www.sql.ru/forum/actualtopics.aspx?bid=3
...
Рейтинг: 0 / 0
Как правильно выполнить процедуру из пакета Oracle 9 в программе на С++ ?
    #34660680
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
//1)цикл чтения файлов
...
//2)цикл чтения строк файла
...
wsprintf(tmpbuff, (CString)"BEGIN K_CARD.INSERT_TRN_FROM_FILE("+
		(CString)"'%s', %s, %s, %s,   %s, %s, '%s', '%s', '%s', '%s', NULL, '%s'); END;", 
		aFile[i], buf_dfiledat, buf_dtrndatetime, buf_itrnsum, 
		buf_icardnum, buf_iaccnum, buf_catmname, buf_ctown, buf_cadress, buf_at_po,   buf01);

cdb.ExecuteSQL(tmpbuff);

Создал индекс (дата транзакции, сумма, карта, АТМ) - все полетело


P.S. У Кайта в начале 2 тома очень хорошо написано, как использовать ... OVER (PARTITON BY ...) - очень ценная вещь (до этого не совсем понятно было) - проще запросы и работает быстрее
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как правильно выполнить процедуру из пакета Oracle 9 в программе на С++ ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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