2009-04-22 2 views
1

В настоящее время перед миграцией файлов Informix ESQLC в Oracle Pro * C задано несколько вопросов. Во-первых, мы используем множество собственных функций Informix в нашем встроенном коде ESQLC, таком как rstrdate(), rtoday() и rjulmdy().Перенос Informix ESQLC в Oracle Pro * C

Любые указатели на то, как их преобразовать в Oracle Pro * C?

Еще одна вещь, с которой я борюсь с пониманием - это тип данных даты Oracle. В Informix мы используем тип long в нашем встроенном коде sql C для любых переменных хоста, касающихся дат для таблиц Informix.

Но в Oracle у меня сложилось впечатление, что даты не передаются взад и вперед так долго, а как символ? Или мы можем по-прежнему указывать переменные хоста как типа long?

ответ

0

Googling «Oracle OCI Date» предлагает такие функции, как OCIDateTimeFromText(), OCIDateSysdate() и, возможно, OCIDateTimeToArray(), соответствующие функциям ESQL/C, которые вы называете. Существует тип OCIDate, который, вероятно, более тесно связан с ESQL/C dtime_t (вероятно, он включает в себя компоненты времени), чем DOM Informix (int4 или long в ESQL/C), но, скорее всего, это тип, который вы должны использовать в ваш перевод.

+0

спасибо Джонатан. Я собираюсь сделать еще несколько исследований, но это определенно не прогулка в парке. Из того, что я прочитал, реализация функциональности OCI вводит гораздо большую ручную работу в миграции Informix для Oracle, чем я бы надеялся. Дело в том, что мы имеем дело только с длинными датами для дат в нашем C-коде, потому что это то, с чем работает Informix. Но теперь, с Oracle, я предполагаю, что мы будем извлекать даты из базы данных как char/string для манипуляций? – KNewton

0

Просто, чтобы добавить к вышесказанному, я создал метод, чтобы дублировать Informix собственной функции rtoday():

int rtoday(long *today) { 
    EXEC SQL BEGIN DECLARE SECTION; 
     time_t t; 
    EXEC SQL END DECLARE SECTION; 

    EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n"); 
    EXEC SQL CONNECT :"user/[email protected]"; 
    EXEC SQL SELECT (new_time(sysdate,'EDT','GMT') - to_date('31-dec-1899','dd-mon-yyyy')) INTO :t FROM DUAL; 

    printf("C Time = %d\n", time(NULL)); 
    printf("SQL Time = %d\n", t); 

    *today=t; 
}