×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

4.3.15. Informix Режим совместимости

4.3.15.1. Дополнительные типы данных
4.3.15.2. Дополнительные или отсутствующие операторы внедренного SQL
4.3.15.3. Области дескрипторов SQLDA, совместимые с Informix
4.3.15.4. Дополнительные функции
4.3.15.5. Дополнительные константы

ecpg может быть запущен в так называемом режиме совместимости с Informix. Если этот режим активен, препроцессор пытается вести себя так, как если бы он был Informix прекомпилятором для Informix E/SQL. В целом это позволит использовать символ доллара вместо команда EXEC SQL конструкции для введения команд внедренного SQL:

$int j = 3;
$CONNECT TO :dbname;
$CREATE TABLE test(i INT PRIMARY KEY, j INT);
$INSERT INTO test(i, j) VALUES (7, :j);
$COMMIT;

Примечание

Между символом $ и следующей за ним директивой препроцессора не должно быть пробелов, то есть, include, define, ifdefи т. д. В противном случае препроцессор ECPG воспримет этот токен как главную переменную.

Существует два режима совместимости: INFORMIX, INFORMIX_SE

При компоновке программ, использующих этот режим совместимости, не забудьте выполнить компоновку с библиотекой libcompat которая поставляется вместе с препроцессором ECPG.

Помимо описанного выше «синтаксического сахара», данный Informix режим совместимости переносит в препроцессор ECPG некоторые функции ввода, вывода и преобразования данных, а также внедренные операторы SQL, известные из E/SQL.

Informix Режим совместимости тесно связан с библиотекой pgtypeslib препроцессора ECPG. Библиотека pgtypeslib сопоставляет типы данных SQL с типами данных в клиентской программе на языке C; также большинство дополнительных функций Informix режима совместимости позволяют работать с этими типами данных хост-программы на языке C. Однако следует учитывать, что степень совместимости ограничена. В нем не предпринимается попыток полностью скопировать Informix поведение; он позволяет выполнять практически те же операции и предоставляет функции с аналогичными именами и базовым поведением, но он не является полной заменой, если вы используете Informix в данный момент. Более того, некоторые типы данных различаются. Например, Digital Q.DataBaseтипы данных datetime и тип данных interval не поддерживают диапазоны, такие как, например, YEAR TO MINUTE поэтому поддержка данной возможности в препроцессоре ECPG также отсутствует.

4.3.15.1. Дополнительные типы данных #

Специальный псевдотип Informix "string", предназначенный для хранения строковых данных с обрезанными справа пробелами, теперь поддерживается в режиме Informix без использования typedef. Фактически, в режиме Informix препроцессор ECPG не обрабатывает исходные файлы, содержащие typedef sometype string;

EXEC SQL BEGIN DECLARE SECTION;
string userid; /* эта переменная будет содержать данные с обрезанными пробелами */
EXEC SQL END DECLARE SECTION;

EXEC SQL FETCH MYCUR INTO :userid;

4.3.15.2. Дополнительные или отсутствующие операторы внедренного SQL #

CLOSE DATABASE #

Этот оператор закрывает текущее соединение. Фактически он является синонимом команды препроцессора ECPG DISCONNECT CURRENT:

$CLOSE DATABASE;                /* закрыть текущее соединение */
EXEC SQL CLOSE DATABASE;

FREE cursor_name #

Из-за различий в механизмах работы препроцессора ECPG и Informix ESQL/C (а именно, какие этапы являются чисто грамматическими преобразованиями, а какие полагаются на базовую библиотеку времени выполнения) отсутствует FREE cursor_name оператор в препроцессоре ECPG. Это связано с тем, что в препроцессоре ECPG DECLARE CURSOR не преобразуется в вызов функции в библиотеке времени выполнения, которая использует имя курсора. Это означает, что в библиотеке времени выполнения препроцессора ECPG не ведется учет SQL-курсоров — он осуществляется только на стороне сервера PostgreSQL.

FREE statement_name #

FREE statement_name является синонимом оператора DEALLOCATE PREPARE statement_name.

4.3.15.3. Области дескрипторов SQLDA, совместимые с Informix #

В режиме совместимости с Informix поддерживается структура, отличная от описанной в Раздел 4.3.7.2. См. ниже:

struct sqlvar_compat
{
    short   sqltype;
    int     sqllen;
    char   *sqldata;
    short  *sqlind;
    char   *sqlname;
    char   *sqlformat;
    short   sqlitype;
    short   sqlilen;
    char   *sqlidata;
    int     sqlxid;
    char   *sqltypename;
    short   sqltypelen;
    short   sqlownerlen;
    short   sqlsourcetype;
    char   *sqlownername;
    int     sqlsourceid;
    char   *sqlilongdata;
    int     sqlflags;
    void   *sqlreserved;
};

struct sqlda_compat
{
    short  sqld;
    struct sqlvar_compat *sqlvar;
    char   desc_name[19];
    short  desc_occ;
    struct sqlda_compat *desc_next;
    void  *reserved;
};

typedef struct sqlvar_compat    sqlvar_t;
typedef struct sqlda_compat     sqlda_t;

Глобальные свойства:

sqld #

Количество полей в дескрипторе SQLDA descriptor.

sqlvar #

Указатель на свойства полей.

desc_name #

Не используется, заполнено нулевыми байтами.

desc_occ #

Размер выделенной структуры.

desc_next #

Указатель на следующую структуру SQLDA, если результирующий набор содержит более одной записи.

зарезервировано #

Неиспользуемый указатель, содержит значение NULL. Сохранено для совместимости с Informix.

Свойства отдельных полей приведены ниже, они хранятся в sqlvar массиве:

sqltype #

Тип поля. Константы определены в файле sqltypes.h

sqllen #

Длина данных поля.

sqldata #

Указатель на данные поля. Указатель имеет char * тип, данные, на которые он указывает, представлены в двоичном формате. Пример:

int intval;

switch (sqldata->sqlvar[i].sqltype)
{
    case SQLINTEGER:
        intval = *(int *)sqldata->sqlvar[i].sqldata;
        break;
  ...
}

sqlind #

Указатель на индикатор NULL. Если возвращается оператором DESCRIBE или FETCH, то этот указатель всегда является корректным. Если используется в качестве входного значения для EXECUTE ... USING sqlda; то значение NULL-указателя означает, что значение данного поля не равно NULL. В противном случае указатель должен быть корректным, а параметр sqlitype должен быть установлен надлежащим образом. Пример:

if (*(int2 *)sqldata->sqlvar[i].sqlind != 0)
    printf("value is NULL\n");

sqlname #

Имя поля. Строка, завершающаяся нулевым символом (0-terminated).

sqlformat #

Зарезервировано в Informix, значение параметра PQfformat для данного поля.

sqlitype #

Тип данных индикатора NULL. При возврате данных с сервера всегда используется тип SQLSMINT. Когда SQLDA используется для параметризованного запроса, данные обрабатываются в соответствии с установленным типом.

sqlilen #

Длина данных индикатора NULL.

sqlxid #

Расширенный тип поля, результат PQftype.

sqltypename
sqltypelen
sqlownerlen
sqlsourcetype
sqlownername
sqlsourceid
sqlflags
sqlreserved #

Не используется.

sqlilongdata #

Это значение равно sqldata если sqllen превышает 32 кБ.

Пример:

EXEC SQL INCLUDE sqlda.h;

    sqlda_t        *sqlda; /* Это не обязательно должно находиться в секции объявлений DECLARE SECTION */

    EXEC SQL BEGIN DECLARE SECTION;
    char *prep_stmt = "select * from table1";
    int i;
    EXEC SQL END DECLARE SECTION;

    ...

    EXEC SQL PREPARE mystmt FROM :prep_stmt;

    EXEC SQL DESCRIBE mystmt INTO sqlda;

    printf("# of fields: %d\n", sqlda->sqld);
    for (i = 0; i < sqlda->sqld; i++)
      printf("field %d: \"%s\"\n", sqlda->sqlvar[i]->sqlname);

    EXEC SQL DECLARE mycursor CURSOR FOR mystmt;
    EXEC SQL OPEN mycursor;
    EXEC SQL WHENEVER NOT FOUND GOTO out;

    while (1)
    {
      EXEC SQL FETCH mycursor USING sqlda;
    }

    EXEC SQL CLOSE mycursor;

    free(sqlda); /* Основная структура должна быть полностью освобождена(),
                  * структуры sqlda и sqlda->sqlvar находятся в одной выделенной области памяти */

Для получения дополнительной информации см. sqlda.h заголовочный файл и src/interfaces/ecpg/test/compat_informix/sqlda.pgc регрессионный тест.

4.3.15.4. Дополнительные функции #

decadd #

Складывает два значения типа данных decimal.

int decadd(decimal *arg1, decimal *arg2, decimal *sum);

Функция принимает указатель на первый операнд типа данных decimal ( (arg1), указатель на второй операнд типа данных decimal ( (arg2) и указатель на значение типа данных decimal, которое будет содержать сумму (sum). В случае успеха функция возвращает 0. ECPG_INFORMIX_NUM_OVERFLOW возвращается в случае переполнения, а ECPG_INFORMIX_NUM_UNDERFLOW — в случае антипереполнения. Значение -1 возвращается при других ошибках, и параметр errno устанавливается в соответствующее errno значение библиотеки pgtypeslib.

deccmp #

Сравнение двух переменных типа данных decimal.

int deccmp(decimal *arg1, decimal *arg2);

Функция принимает указатель на первое значение типа данных decimal (arg1), указатель на второе значение типа данных decimal (arg2) и возвращает целое число, указывающее, какое из значений больше.

  • 1, если значение, на которое arg1 указывает первый параметр, больше, чем значение, на которое var2 указывает параметр,

  • -1, если значение, на которое arg1 меньше, чем значение, на которое указывает значение, на которое arg2 указывает на

  • 0, если значение, на которое arg1 указывает первый указатель, и значение, на которое arg2 указывает второй указатель, равны

deccopy #

Копирование значения типа данных decimal.

void deccopy(decimal *src, decimal *target);

Функция принимает указатель на значение типа данных decimal, которое должно быть скопировано, в качестве первого аргумента (src) и указатель на целевую структуру типа данных decimal (target) в качестве второго параметра.

deccvasc #

Преобразование значения из представления ASCII в тип данных decimal.

int deccvasc(char *cp, int len, decimal *np);

Функция принимает указатель на строку, содержащую текстовое представление строковое представление числа для преобразования (cp), а также его длина len. np представляет собой указатель на тип данных decimal, в который сохраняется результат операции.

Допустимыми форматами являются, например: -2, .794, +3.44, 592.49E07 или -32.84e-4.

Функция возвращает 0 в случае успешного выполнения. Если произошло переполнение или антипереполнение, ECPG_INFORMIX_NUM_OVERFLOW или ECPG_INFORMIX_NUM_UNDERFLOW возвращается. Если ASCII- представление не удалось разобрать, ECPG_INFORMIX_BAD_NUMERIC возвращается или ECPG_INFORMIX_BAD_EXPONENT если эта проблема возникла при синтаксическом анализе экспоненты.

deccvdbl #

Преобразование значения типа данных double в значение типа данных decimal.

int deccvdbl(double dbl, decimal *np);

Функция принимает переменную типа данных double, которую необходимо преобразуемое значение в качестве первого аргумента (dbl). В качестве второго аргумента (np), функция получает указатель на переменную типа данных decimal, которая должна содержать результат операции.

Функция возвращает 0 в случае успеха и отрицательное значение, если преобразование завершилось ошибкой.

deccvint #

Преобразование значения типа int в значение типа данных decimal.

int deccvint(int in, decimal *np);

Функция принимает переменную типа int, которая должна быть преобразуемое значение в качестве первого аргумента (in). В качестве второго аргумента (np), функция получает указатель на переменную типа данных decimal, которая должна содержать результат операции.

Функция возвращает 0 в случае успеха и отрицательное значение, если преобразование завершилось ошибкой.

deccvlong #

Преобразование значения типа long в значение типа данных decimal.

int deccvlong(long lng, decimal *np);

Функция принимает переменную типа long, которая должна быть преобразуемое значение в качестве первого аргумента (lng). В качестве второго аргумента (np), функция получает указатель на переменную типа данных decimal, которая должна содержать результат операции.

Функция возвращает 0 в случае успеха и отрицательное значение, если преобразование завершилось ошибкой.

decdiv #

Выполняет деление двух переменных типа данных decimal.

int decdiv(decimal *n1, decimal *n2, decimal *result);

Функция принимает указатели на переменные, выступающие в качестве первого (n1) и второго (n2) операндов и вычисляет частное. n1/n2. result представляет собой указатель на переменную, предназначенную для хранения результата операции.

В случае успеха возвращается 0, при ошибке деления — отрицательное значение. Если произошло переполнение или потеря точности, функция возвращает ECPG_INFORMIX_NUM_OVERFLOW или ECPG_INFORMIX_NUM_UNDERFLOW соответственно. Если зафиксирована попытка деления на ноль, функция возвращает ECPG_INFORMIX_DIVIDE_ZERO.

decmul #

Выполняет умножение двух значений типа данных decimal.

int decmul(decimal *n1, decimal *n2, decimal *result);

Функция принимает указатели на переменные, выступающие в качестве первого (n1) и второго (n2) операндов и вычисляет частное. n1*n2. result представляет собой указатель на переменную, предназначенную для хранения результата операции.

В случае успеха возвращается 0, а в случае ошибки умножения — отрицательное значение. Если произошло переполнение или потеря точности, функция возвращает ECPG_INFORMIX_NUM_OVERFLOW или ECPG_INFORMIX_NUM_UNDERFLOW соответственно.

decsub #

Вычитание одного значения типа данных decimal из другого.

int decsub(decimal *n1, decimal *n2, decimal *result);

Функция принимает указатели на переменные, выступающие в качестве первого (n1) и второго (n2) операндов и вычисляет частное. n1-n2. result представляет собой указатель на переменную, предназначенную для хранения результата операции.

В случае успеха возвращается 0, а в случае ошибки вычитания — отрицательное значение. отрицательное значение. Если произошло переполнение или потеря точности, функция возвращает ECPG_INFORMIX_NUM_OVERFLOW или ECPG_INFORMIX_NUM_UNDERFLOW соответственно.

dectoasc #

Преобразование переменной типа данных decimal в её ASCII-представление в языке C в виде строки типа данных char*.

int dectoasc(decimal *np, char *cp, int len, int right)

Функция принимает указатель на переменную типа данных decimal (np), которую она преобразует в текстовое представление. cp — это буфер, который должен содержать результат операции. Параметр right определяет, какое количество цифр после десятичной точки должно быть включено в вывод. Результат будет округлено до указанного количества десятичных знаков. Установка параметра right в значение -1 означает, что все доступные десятичные знаки должны быть включены в результирующую строку. Если длина выходного буфера, которая определяется параметром len недостаточна для хранения текстового представления, включая завершающий нулевой байт, в результат записывается только один * символ и возвращается значение -1. returned.

Функция возвращает -1, если размер буфера cp был недостаточен или ECPG_INFORMIX_OUT_OF_MEMORY если оперативная память была исчерпана.

dectodbl #

Преобразование переменной типа данных decimal в тип данных double.

int dectodbl(decimal *np, double *dblp);

Функция принимает указатель на преобразуемое значение типа данных decimal (np) и указатель на переменную типа данных double, которая должна содержать результат операции (dblp).

В случае успеха возвращается 0, а если преобразование завершилось ошибкой — отрицательное значение.

dectoint #

Преобразование переменной типа данных decimal в целое число.

int dectoint(decimal *np, int *ip);

Функция принимает указатель на преобразуемое значение типа данных decimal (np) и указатель на целочисленную переменную, которая должна содержать результат операции (ip).

В случае успеха возвращается 0, а если преобразование завершилось ошибкой — отрицательное значение. Если произошло переполнение, ECPG_INFORMIX_NUM_OVERFLOW возвращается значение.

Обратите внимание, что реализация в препроцессоре ECPG отличается от Informix информатики. Informix ограничивает целое число диапазоном от -32767 до 32767, в то время как ограничения в реализации препроцессора ECPG зависят от архитектуры (INT_MIN .. INT_MAX).

dectolong #

Преобразование переменной типа данных decimal в длинное целое число (тип long).

int dectolong(decimal *np, long *lngp);

Функция принимает указатель на преобразуемое значение типа данных decimal (np) и указатель на переменную типа long, в которой должна содержать результат операции (lngp).

В случае успеха возвращается 0, а если преобразование завершилось ошибкой — отрицательное значение. Если произошло переполнение, ECPG_INFORMIX_NUM_OVERFLOW возвращается значение.

Обратите внимание, что реализация в препроцессоре ECPG отличается от Informix информатики. Informix ограничивает длинное целое число диапазоном от -2,147,483,647 до 2,147,483,647, тогда как ограничения в реализации препроцессора ECPG зависят от архитектуры (-LONG_MAX .. LONG_MAX).

rdatestr #

Преобразует дату в строку типа char* в языке C.

int rdatestr(date d, char *str);

Функция принимает два аргумента: первым является дата для преобразования (d), а вторым — указатель на целевую строку. Формат вывода всегда yyyy-mm-dd, поэтому необходимо выделить как минимум 11 байт (включая нулевой байт-терминатор) для данной строки.

Функция возвращает 0 в случае успеха и отрицательное значение в случае ошибки.

Обратите внимание, что реализация в препроцессоре ECPG отличается от Informix реализации. В Informix на формат может влиять установка переменных окружения. Однако в препроцессоре ECPG невозможно изменить формат вывода.

rstrdate #

Выполняет разбор текстового представления даты.

int rstrdate(char *str, date *d);

Функция принимает текстовое представление даты для преобразования (str) и указатель на переменную типа date (d). Данная функция не позволяет указывать маску формата. Она использует маску формата по умолчанию Informix которая представляет собой mm/dd/yyyy. Внутренне данная функция реализована посредством rdefmtdate. Следовательно, rstrdate принимает значение не быстрее, и при наличии выбора следует отдавать предпочтение rdefmtdate которая позволяет указывать маску формата явным образом.

Функция возвращает те же значения, что и rdefmtdate.

rtoday #

Получение текущей даты.

void rtoday(date *d);

Функция PGTYPESdate_today принимает указатель на переменную типа date (d) которую она устанавливает равной текущей дате.

Внутренне данная функция использует функцию PGTYPESdate_today функция.

rjulmdy #

Извлечение значений дня, месяца и года из переменной типа date.

int rjulmdy(date d, short mdy[3]);

Данная функция принимает значение даты d и указатель на массив из 3 целочисленных значений типа short mdy. Имя переменной указывает на последовательный порядок: mdy[0] будет содержать порядковый номер месяца, mdy[1] будет содержать значение дня, а mdy[2] будет содержать значение года.

На данный момент функция всегда возвращает 0.

На внутреннем уровне функция использует PGTYPESdate_julmdy функция.

rdefmtdate #

Используйте маску формата для преобразования символьной строки в значение типа данных char date.

int rdefmtdate(date *d, char *fmt, char *str);

Функция принимает указатель на значение даты, которое должно содержать результат операции (d), маску формата, используемую для разбора даты (fmt) и строку типа char* в языке C, содержащую текстовое представление даты (str). Текстовое представление должно соответствовать маске формата. При этом нет необходимости в строгом соответствии 1:1 строки и маски формата. Данная функция анализирует только последовательность и ищет литералы, yy или yyyy которые определяют позицию года, mm для указания позиции месяца и dd для указания позиции дня.

Функция возвращает следующие значения:

  • 0 — функция успешно завершила работу.

  • ECPG_INFORMIX_ENOSHORTDATE — дата не содержит разделителей между днем, месяцем и годом. В этом случае входная строка должна иметь длину ровно 6 или 8 байт, однако это условие не соблюдено.

  • ECPG_INFORMIX_ENOTDMY — строка формата некорректно определяет последовательность года, месяца и дня.

  • ECPG_INFORMIX_BAD_DAY — входная строка не содержит допустимое значение дня.

  • ECPG_INFORMIX_BAD_MONTH — входная строка не содержит допустимое значение месяца.

  • ECPG_INFORMIX_BAD_YEAR — входная строка не содержит допустимое значение года.

На внутреннем уровне реализация данной функции использует PGTYPESdate_defmt_asc функцию. См. соответствующий справочный раздел, где приведена таблица с примерами входных данных.

rfmtdate #

Преобразование переменной типа date в её текстовое представление с использованием маска формата.

int rfmtdate(date d, char *fmt, char *str);

Функция принимает дату для преобразования (d), форматная маска (fmt) и строка, которая будет содержать текстовое представление даты (str).

При успешном завершении возвращается 0, при возникновении ошибки — отрицательное значение.

Внутренне данная функция использует функцию PGTYPESdate_fmt_asc функция; примеры использования приведены в соответствующем справочном разделе.

rmdyjul #

Создать значение даты из массива из 3 коротких целых чисел (short integer), задающих день, месяц и год даты.

int rmdyjul(short mdy[3], date *d);

Данная функция принимает массив из 3 коротких целых чисел (mdy) и указатель на переменную типа date, которая должна содержать результат операции.

В настоящее время функция всегда возвращает 0.

Внутренняя реализация функции использует функцию PGTYPESdate_mdyjul.

rdayofweek #

Возвращает число, представляющее день недели для заданного значения даты.

int rdayofweek(date d);

Функция принимает переменную типа date d в качестве единственного аргумента и возвращает целое число, обозначающее день недели для этой даты.

  • 0 — воскресенье

  • 1 — понедельник

  • 2 — вторник

  • 3 — среда

  • 4 — четверг

  • 5 — пятница

  • 6 — суббота

Внутренняя реализация функции использует функцию PGTYPESdate_dayofweek.

dtcurrent #

Получение текущей временной метки.

void dtcurrent(timestamp *ts);

Функция считывает текущую временную метку и сохраняет её в переменную типа timestamp, на которую ts указывает.

dtcvasc #

Преобразует строку из текстового представления в переменную типа timestamp.

int dtcvasc(char *str, timestamp *ts);

Функция принимает строку для анализа (str) и указатель на переменную типа timestamp, которая должна содержать результат операции (ts).

Функция возвращает 0 в случае успеха и отрицательное значение в случае ошибки.

Внутренне данная функция использует функцию PGTYPEStimestamp_from_asc функция. См. соответствующее описание с таблицей примеров входных данных.

dtcvfmtasc #

Преобразует строку из текстового представления в переменную типа timestamp с использованием маски формата.

dtcvfmtasc(char *inbuf, char *fmtstr, timestamp *dtvalue)

Функция принимает строку для анализа (inbuf), the используемая маска формата (fmtstr) и указатель на переменную типа timestamp переменная, в которой должен быть сохранен результат операции (dtvalue).

Данная функция реализована при помощи PGTYPEStimestamp_defmt_asc функция. См. документацию там приведен список спецификаторов формата, которые можно использовать.

Функция возвращает 0 в случае успеха и отрицательное значение в случае ошибки.

dtsub #

Вычитает одну временную метку из другой и возвращает переменную, имеющую interval.

int dtsub(timestamp *ts1, timestamp *ts2, interval *iv);

Данная функция вычитает значение переменной типа timestamp, на которую ts2 указывает параметр, из значения переменной типа timestamp, на которую ts1 указывает параметр, и сохраняет результат в переменной типа данных interval, на которую iv указывает параметр.

В случае успеха функция возвращает 0, а если возникла ошибка — отрицательное значение.

dttoasc #

Преобразует переменную типа timestamp в строку тип char* в языке C.

int dttoasc(timestamp *ts, char *output);

Данная функция принимает указатель на переменную типа timestamp для преобразования (ts) и строку, которая должна содержать результат выполнения операции (вывод). Она преобразует ts в её текстовое представление в соответствии со стандарт SQL, которым является YYYY-MM-DD HH:MM:SS.

В случае успеха функция возвращает 0, а если возникла ошибка — отрицательное значение.

dttofmtasc #

Преобразование переменной типа timestamp в строку типа char* в языке C с использованием маски формата.

int dttofmtasc(timestamp *ts, char *output, int str_len, char *fmtstr);

Функция принимает указатель на преобразуемую временную метку в качестве первого аргумента (ts), указатель на выходной буфер (вывод), максимальная длина, выделенная для выходного буфера (str_len) и маска формата для использования при преобразовании (fmtstr).

В случае успеха функция возвращает 0, а если возникла ошибка — отрицательное значение.

Внутри эта функция использует функцию PGTYPEStimestamp_fmt_asc функцию. См. справочную информацию о том, какие спецификаторы маски формата можно использовать.

intoasc #

Преобразовать переменную типа данных interval в строку типа char* в языке C.

int intoasc(interval *i, char *str);

Функция принимает указатель на переменную типа данных interval для преобразования (i) и строку, которая должна содержать результат выполнения операции (str). Она преобразует i в её текстовое представление в соответствии со стандарт SQL, которым является YYYY-MM-DD HH:MM:SS.

В случае успеха функция возвращает 0, а если возникла ошибка — отрицательное значение.

rfmtlong #

Преобразовать значение типа long integer в его текстовое представление, используя маска формата.

int rfmtlong(long lng_val, char *fmt, char *outbuf);

Функция принимает значение типа long lng_val, форматную маску fmt и указатель на выходной буфер outbuf. Функция преобразует значение типа long в соответствии с форматом маски в его текстовое представление.

Маска формата может состоять из следующих форматирующих символов:

  • * (asterisk) — если эта позиция должна быть пустой, в противном случае заполните её символом «звёздочка».

  • & (ampersand) — если эта позиция должна быть пустой, в противном случае заполните её нулем.

  • # — преобразовывать ведущие нули в пробелы.

  • < — выравнивать число в строке по левому краю.

  • , (comma) — группировать числа из четырех и более цифр в группы по три цифры, разделенные запятой.

  • . (period) — этот символ отделяет целую часть числа от дробной части.

  • - (minus) — знак минуса выводится, если число является отрицательным.

  • + (plus) — знак плюса выводится, если число является положительным.

  • ( — заменяет знак минуса перед отрицательным числом. Знак минуса не будет отображаться.

  • ) — этот символ заменяет минус и выводится после отрицательного значения.

  • $ — символ валюты.

rupshift #

Преобразует строку в верхний регистр.

void rupshift(char *str);

Данная функция принимает указатель на строку и преобразует каждый символ в нижнем регистре в символ верхнего регистра.

byleng #

Возвращает количество символов в строке без учета замыкающих пробелов.

int byleng(char *str, int len);

Функция принимает строку фиксированной длины в качестве первого аргумента (str) и её длину в качестве второго аргумента (len). Она возвращает количество значащих символов, то есть длину строки без учета замыкающих пробелов.

ldchar #

Копирует строку фиксированной длины в строку, завершающуюся нулевым символом.

void ldchar(char *src, int len, char *dest);

Функция получает строку фиксированной длины для копирования (src), её длину (len) и указатель на целевую область памяти (dest). Обратите внимание, что необходимо зарезервировать как минимум len+1 байт для строки, на которую dest указывает параметр. Функция копирует не более len байт в новое расположение (меньше, если исходная строка содержит завершающие пробелы) и добавляет нулевой символ-терминатор.

rgetmsg #

int rgetmsg(int msgnum, тип данных char *s, int maxsize);

Данная функция существует, но в настоящее время не реализована!

rtypalign #

int rtypalign(int offset, int type);

Данная функция существует, но в настоящее время не реализована!

rtypmsize #

int rtypmsize(int type, int len);

Данная функция существует, но в настоящее время не реализована!

rtypwidth #

int rtypwidth(int sqltype, int sqllen);

Данная функция существует, но в настоящее время не реализована!

rsetnull #

Установка значения переменной в NULL.

int rsetnull(int t, char *ptr);

Функция принимает целочисленный параметр, определяющий тип переменной, и указатель на саму переменную, который приводится к C-указателю типа данных char*.

Существуют следующие типы:

  • CCHARTYPE — Для переменной типа тип данных char или char*

  • CSHORTTYPE — Для переменной типа short int

  • CINTTYPE — Для переменной типа int

  • CBOOLTYPE — Для переменной типа boolean

  • CFLOATTYPE — Для переменной типа float

  • CLONGTYPE — Для переменной типа long

  • CDOUBLETYPE — Для переменной типа тип данных double

  • CDECIMALTYPE — Для переменной типа тип данных decimal

  • CDATETYPE — Для переменной типа date

  • CDTIMETYPE — Для переменной типа timestamp

Ниже приведен пример вызова данной функции:

$char c[] = "abc       ";
$short s = 17;
$int i = -74874;

rsetnull(CCHARTYPE, (char *) c);
rsetnull(CSHORTTYPE, (char *) &s);
rsetnull(CINTTYPE, (char *) &i);

risnull #

Проверка переменной на значение NULL.

int risnull(int t, char *ptr);

Функция принимает тип проверяемой переменной (t) ), а также указатель на данную переменную (ptr). Обратите внимание, что последний должен быть приведен к типу char*. Список возможных типов переменных приведен в описании функции rsetnull for a list of possible variable types.

Ниже приведен пример использования данной функции:

$char c[] = "abc       ";
$short s = 17;
$int i = -74874;

risnull(CCHARTYPE, (char *) c);
risnull(CSHORTTYPE, (char *) &s);
risnull(CINTTYPE, (char *) &i);

4.3.15.5. Дополнительные константы #

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

ECPG_INFORMIX_NUM_OVERFLOW #

Функции возвращают данное значение, если при вычислении произошло переполнение. вычислении. На внутреннем уровне значение определено как -1200 (макроопределение Informix definition).

ECPG_INFORMIX_NUM_UNDERFLOW #

Функции возвращают данное значение, если при вычислении произошла потеря значимости. На внутреннем уровне значение определено как -1201 (макроопределение Informix определение).

ECPG_INFORMIX_DIVIDE_ZERO #

Функции возвращают данное значение, если зафиксирована попытка деления на ноль. На внутреннем уровне оно определено как -1202 (параметр Informix определение).

ECPG_INFORMIX_BAD_YEAR #

Функции возвращают данное значение, если при разборе даты обнаружено некорректное значение года. На внутреннем уровне оно определено как -1204 (параметр Informix definition).

ECPG_INFORMIX_BAD_MONTH #

Функции возвращают данное значение, если при разборе даты обнаружено некорректное значение месяца. некорректное значение года. На внутреннем уровне оно определено как -1205 (параметр Informix definition).

ECPG_INFORMIX_BAD_DAY #

Функции возвращают данное значение, если при разборе даты обнаружено некорректное значение дня. некорректное значение года. На внутреннем уровне оно определено как -1206 (параметр Informix definition).

ECPG_INFORMIX_ENOSHORTDATE #

Функции возвращают данное значение, если процедуре разбора требуется краткое представление даты, но строка даты имеет недопустимую длину. На внутреннем уровне оно определено как -1209 (параметр Informix определение).

ECPG_INFORMIX_DATE_CONVERT #

Функции возвращают данное значение, если при форматировании даты произошла ошибка. На внутреннем уровне оно определено как -1210 (параметр Informix определение).

ECPG_INFORMIX_OUT_OF_MEMORY #

Функции возвращают данное значение, если во время выполнения операции произошло исчерпание памяти. их работа. Внутренне оно определено как -1211 (параметр Informix определение).

ECPG_INFORMIX_ENOTDMY #

Функции возвращают это значение, если подпрограмма синтаксического анализа должна была получить маску формата (например, mmddyy), но не все поля были указаны корректно. Внутренне оно определено как -1212 (параметр Informix определение).

ECPG_INFORMIX_BAD_NUMERIC #

Функции возвращают это значение, если подпрограмма синтаксического анализа не может разобрать текстовое представление для типа numeric, так как оно содержит ошибки, или если подпрограмма не может завершить вычисление с участием переменных типа numeric, так как по крайней мере одна из переменных типа numeric недействительна. Внутренне оно определено как -1213 (параметр Informix определение).

ECPG_INFORMIX_BAD_EXPONENT #

Функции возвращают это значение, если подпрограмма синтаксического анализа не может разобрать экспоненту. Внутренне оно определено как -1216 (параметр Informix определение).

ECPG_INFORMIX_BAD_DATE #

Функции возвращают это значение, если подпрограмма синтаксического анализа не может разобрать дату. Внутренне оно определено как -1218 (параметр Informix определение).

ECPG_INFORMIX_EXTRA_CHARS #

Функции возвращают это значение, если подпрограмме синтаксического анализа переданы лишние символы, которые он не может разобрать. Внутренне он определен как -1264 (параметр Informix определение).

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению