Как стать автором
Обновить

Получение данных из СУБД Oracle средствами С/C++ под SuSE Linux

Время на прочтение 2 мин
Количество просмотров 1.7K
Привет хабрачеловек!

Столкнулся на днях с необходимостью получить данные из СУБД Oracle средствами С/C++ под SuSE Linux

До этого неоднократно выполнял подобные вещи из других языков (Perl, PHP, sh), но вот из C еще ни разу.
Из всех доступных средств, которые позволяют подключиться к Oracle, я остановился на методе прекомпиляции proc, бинарник которой входит в базовую комплектацию Oracle клиента.


Система на которой будет происходить буйство красок:
vmotp# cat /etc/SuSE-release
SUSE Linux Enterprise Server 11 (i586)
VERSION = 11
PATCHLEVEL = 0
+
oracle.client VER:10.2.0.1.0


Сама БД находится на другой машине. Версия сервера: 9.0.2 (знаю, что старая, но она служит исключительно как историческая реплика и простая база для временных таблиц)

Для начала сделаем пример на подобие «Hello World», который будет выводить на экран результат запроса
SELECT 12345,'TEST STRING' FROM dual;

Делаем файл test_ora.pc со следующим содержанием

#include <ctype.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>

#define ORA_PARAM "ORACLE_LOGIN/ORACLE_PASS@ORACLE_SID" /*Меняем зачеркнутое на свои настройки подключения к БД */

EXEC SQL BEGIN DECLARE SECTION; /* Далее до строки END DECLARE SECTION идет описание переменных, которые будут использованы для чтения строк из Oracle*/
static int ora_i; /*Переменная для чтения INT значения */
static VARCHAR ora_str[20]; /*Переменная для чтения CHAR значения */
static VARCHAR connect_str[100]; /*Переменная для параметров подключения */
EXEC SQL END DECLARE SECTION;

EXEC SQL INCLUDE SQLCA; /*Включаем SQLCA что бы получать ошибки (насколько я понял) */

int main( int argc, char* argv[] )
{
char str[21]; /*Объявляем переменную для переформатирования CHAR данных из БД*/
memset(str,0,sizeof(str)); /*Очищаем переменную для подключения*/
connect_str.len = sprintf(connect_str.arr,ORA_PARAM); /*Заносим в нее параметры подключения*/
EXEC SQL CONNECT :connect_str; /*Подключаемся*/
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL SELECT 12345,'TEST STRING' INTO :ora_i,:ora_str FROM dual; /*Выполняем запрос, счиывая значения в подготовленные переменные*/
sprintf( str, "%*.*s", ora_str.len, ora_str.len, ora_str.arr ); /*Переводим считанную переменную CHAR в формат пригодный для использования в C */
printf("\ni=[%d], str=[%s]\n", ora_i, str ); /*Выводим результат на экран*/
return 0;
} /* end of main() */


Теперь необходимо «скормить» наш файл утилите proc, по умолчанию она находится по пути $ORACLE_HOME/bin/
/opt/oracle/product/11gR1/db/bin/proc CODE=ANSI_C include=/opt/oracle/product/11gR1/db/lib include=/usr/lib/gcc/i586-suse-linux/4.3/include/ ireclen=4800 oreclen=4800 select_error=no release_cursor=no hold_cursor=yes ltype=none cpp_suffix=c USERID=ORACLE_LOGIN/ORACLE_PASS@ORACLE_SID SQLCHECK=SEMANTICS iname=test_ora.pc;


cc test_ora.c -L/opt/oracle/product/11gR1/db/lib /opt/oracle/product/11gR1/db/lib/libclntsh.so /opt/oracle/product/11gR1/db/lib/libsqlplus.a -o test_ora;

Запускаем получившийся файл и видим, что фокус удался:
vmotp$ ./test_ora

i=[12345], str=[TEST STRING]
vmotp$


PS. Данную статью публикую по просьбе моего друга. У которого еще нет логина на хабр, если у кого-то остались инвайты, поделитесь, пожалуйста ( lanarion (at) gmail.com ).
Теги:
Хабы:
+8
Комментарии 2
Комментарии Комментарии 2

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн