选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.4 已于 2020 年 2 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

33.15. Informix兼容模式 #

ecpg可以运行在一种所谓的Informix 兼容模式中。如果这种模式被激活,它的行为就好像它是一个用于Informix E/SQL 的Informix预处理器。一般而言,这将允许你使用美元符号替代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;

注意

$与后面的预处理器指令(如includedefineifdef等)之间不能有任何空白。否则,预处理器会将该词元解析为主变量。

有两种兼容性模式:INFORMIXINFORMIX_SE

在链接使用这种兼容性模式的程序时,要记得链接上和 ECPG 一起发布的libcompat

除了之前解释过的语法糖,Informix兼容模式从 E/SQL 中移植了一些用于输入、输出和数据转换的函数以及嵌入式 SQL 语句到 ECPG 中。

Informix兼容模式与 ECPG 的 pgtypeslib 库密切相关。pgtypeslib 将 SQL 数据类型映射到 C 主程序中的数据类型,Informix兼容模式中的大多数附加函数用于操作这些 C 主程序类型。但兼容范围有限。它并不试图复制Informix的行为,而是允许执行大致相同的操作,并提供名称和基本行为相同的函数;如果目前使用的是Informix,则不能用它直接替代。此外,有些数据类型也有差异。例如,PostgreSQL的日期时间和 interval 类型不支持YEAR TO MINUTE这样的范围,ECPG 也不支持。

33.15.1. 附加类型 #

Informix 模式现在支持 Informix 特有的“string”伪类型,用于存储去除尾随空格的字符串数据,无需使用typedef。事实上,在 Informix 模式中,ECPG 拒绝处理包含typedef sometype string;的源文件。

EXEC SQL BEGIN DECLARE SECTION;
string userid; /* 此变量将包含去除尾随空格的数据 */
EXEC SQL END DECLARE SECTION;

EXEC SQL FETCH MYCUR INTO :userid;

33.15.2. 附加的/缺少的 嵌入式 SQL 语句 #

CLOSE DATABASE

这个语句关闭当前连接。实际上,这是ECPG的DISCONNECT CURRENT的同义词:

$CLOSE DATABASE;                /* close the current connection */
EXEC SQL CLOSE DATABASE;
FREE cursor_name

由于ECPG的工作方式与Informix的ESQL/C有所不同(即,哪些步骤纯粹是语法转换,哪些步骤依赖于底层运行时库), 在ECPG中没有FREE cursor_name语句。这是因为在ECPG中, DECLARE CURSOR不会转换为使用游标名称的运行时库的函数调用。 这意味着在ECPG运行时库中没有SQL游标的运行时记录,只在PostgreSQL服务器中有。

FREE statement_name

FREE statement_nameDEALLOCATE PREPARE statement_name的同义词。

33.15.3. Informix-兼容的 SQLDA 描述符区域 #

Informix 兼容模式支持的结构体与第 33.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描述符中的字段数量。

sqlvar

每一个域属性的指针。

desc_name

未使用,用零字节填充。

desc_occ

已分配结构体的尺寸。

desc_next

如果结果集包含多于一个记录,这个域是下一个 SQLDA 结构体的指针。

reserved

未使用的指针,包含 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 终止的字符串。

sqlformat

在 Informix 中保留;这里是对该字段调用 PQfformat() 所得的值。

sqlitype

NULL 指示符数据的类型。从服务器返回数据时,它始终是 SQLSMINT。将SQLDA用于参数化查询时,按所设置的类型处理数据。

sqlilen

NULL 指示符数据的长度。

sqlxid

字段的扩展类型,即 PQftype() 的结果。

sqltypename
sqltypelen
sqlownerlen
sqlsourcetype
sqlownername
sqlsourceid
sqlflags
sqlreserved

未使用。

sqlilongdata

如果sqllen大于 32KB,它等于sqldata

示例:

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); /* 主结构完全被 free(),sqlda 和 sqlda->sqlvar 在一个已分配区域中 */

更多信息参见 sqlda.h 头文件和 src/interfaces/ecpg/test/compat_informix/sqlda.pgc 回归测试。

33.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设为 pgtypeslib 中对应的errno值。

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)及其长度lennp是指向用于保存操作结果的 decimal 值的指针。

例如,有效的格式包括: -2.794+3.44592.49E07-32.84e-4

该函数成功返回0。如果发生溢出或下溢,则返回ECPG_INFORMIX_NUM_OVERFLOWECPG_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/n2result是应该保存操作结果的变量的指针。

在成功时返回0,如果除法失败则返回负值。 如果发生溢出或下溢,则函数分别返回 ECPG_INFORMIX_NUM_OVERFLOWECPG_INFORMIX_NUM_UNDERFLOW。如果尝试 除以零,则函数返回ECPG_INFORMIX_DIVIDE_ZERO

decmul

将两个 decimal 值相乘。

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

该函数接收指向第一个(n1)和第二个(n2)操作数的变量的指针, 并计算n1*n2result是一个指向应该保存操作结果的变量的指针。

在成功时返回0,如果乘法失败则返回负值。如果发生溢出或下溢,函数分别返回 ECPG_INFORMIX_NUM_OVERFLOWECPG_INFORMIX_NUM_UNDERFLOW

decsub

从一个 decimal 值中减去另一个 decimal 值。

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

该函数接收指向第一个(n1)和第二个(n2)操作数的变量的指针, 并计算n1-n2result是应该保存操作结果的变量的指针。

在成功时返回0,如果减法失败则返回负值。如果发生溢出或下溢,函数分别返回 ECPG_INFORMIX_NUM_OVERFLOWECPG_INFORMIX_NUM_UNDERFLOW

dectoasc

将 decimal 类型变量转换为 C char* 字符串中的 ASCII 表示。

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

该函数接收指向 decimal 类型变量的指针(np),并将该变量转换为文本表示。cp是用于保存操作结果的缓冲区。参数right指定输出中小数点右侧的位数,结果将舍入到这个小数位数。将right设为 -1 表示输出所有可用的小数位。如果len指定的输出缓冲区长度不足以容纳文本表示及末尾的零字节,则只在结果中存入一个*字符,并返回 -1。

如果缓冲区cp太小,函数返回 -1;如果内存耗尽,则返回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_MAX .. INT_MAX)。

dectolong

将 decimal 类型的变量转换为长整数。

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

将日期转换成 C char* 字符串。

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);

该函数接收一个指向 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

使用格式掩码将字符串转换为日期类型的值。

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

该函数接收一个指向用于保存操作结果的 date 值的指针(d)、用于解析日期的格式掩码(fmt),以及包含日期文本表示的 C char* 字符串(str)。文本表示应与格式掩码匹配,但字符串与格式掩码无需一一对应。该函数只分析先后顺序,并查找表示年份位置的yyyyyy、表示月份位置的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 整数的数组创建日期值,这些整数指定日期的日、月和年。

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

该函数接收包含 3 个 short 整数的数组(mdy)和一个指向 date 类型变量的指针,用来保存操作结果。

目前该函数始终返回0。

在内部,该函数实现为使用函数PGTYPESdate_mdyjul

rdayofweek

为一个日期值返回表示它是星期几的数字。

int rdayofweek(date d);

这个函数接收日期变量d作为它唯一的参数并且返回一个整数说明这个日期是星期几。

  • 0 - 星期日

  • 1 - 星期一

  • 2 - 星期二

  • 3 - 星期三

  • 4 - 星期四

  • 5 - 星期五

  • 6 - 星期六

在内部,该函数被实现为使用函数PGTYPESdate_dayofweek

dtcurrent

检索当前时间戳。

void dtcurrent(timestamp *ts);

该函数检索当前时间戳,并将其保存到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)、使用的格式掩码(fmtstr),以及指向用于保存操作结果的 timestamp 变量的指针(dtvalue)。

这个函数是通过PGTYPEStimestamp_defmt_asc函数实现的。请参阅那里的文档,了解可用的格式说明符列表。

该函数在成功时返回0,在错误时返回负值。

dtsub

从一个时间戳中减去另一个时间戳,并返回一个 interval 类型的变量。

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

该函数从ts1指向的时间戳变量中减去ts2指向的时间戳变量,并将结果存入iv指向的 interval 变量中。

成功时返回 0,发生错误时返回负值。

dttoasc

将 timestamp 变量转换为 C char* 字符串。

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

该函数接收指向待转换 timestamp 变量的指针(ts),以及用于保存操作结果的字符串(output)。它将ts转换为符合 SQL 标准的文本表示,格式为YYYY-MM-DD HH:MM:SS

成功时返回 0,发生错误时返回负值。

dttofmtasc

使用格式掩码将 timestamp 变量转换为 C char*。

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

该函数的第一个参数是指向待转换时间戳的指针(ts),随后是指向输出缓冲区的指针(output)、为输出缓冲区分配的最大长度(str_len),以及转换所用的格式掩码(fmtstr)。

成功时返回 0,发生错误时返回负值。

在内部,此函数使用PGTYPEStimestamp_fmt_asc函数。请参阅那里的参考资料,了解可以使用哪些格式掩码说明符。

intoasc

将 interval 变量转换为 C char* 字符串。

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

该函数接受指向待转换 interval 变量的指针(i),以及用于保存操作结果的字符串(str)。它将 i 转换为符合 SQL 标准的文本表示,格式为 YYYY-MM-DD HH:MM:SS

成功时返回 0,发生错误时返回负值。

rfmtlong

将长整型值使用格式掩码转换为其文本表示形式。

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

该函数接收长整型值lng_val,格式掩码fmt和指向输出缓冲区outbuf的指针。 它根据格式掩码将长整型值转换为其文本表示形式。

格式掩码可以由以下格式指定字符组成:

  • *(星号)- 如果此位置为空白,用星号填充。

  • &(和号)- 如果此位置为空白,用零填充。

  • # - 将前导零转换为空格。

  • < - 将数字左对齐在字符串中。

  • ,(逗号)- 将四位或更多位的数字每三位分为一组,用逗号分隔。

  • .(句点)- 此字符将整数部分与小数部分分隔开。

  • -(减号)- 如果数字是负值,则显示减号。

  • +(加号)- 如果数字是正值,则显示加号。

  • ( - 这个字符替换负数前面的减号。减号不会显示。

  • ) - 这个字符替换减号,并打印在负值后面。

  • $ - 货币符号。

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)。 请注意,你需要为dest指向的字符串保留至少len+1字节。 该函数最多复制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 - 用于charchar*类型的变量

  • 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以获取可能的变量类型列表。

这是如何使用这个函数的示例:

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

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

33.15.5. 额外的常量 #

注意这里所有的常量都描述错误并且它们都被定义为表示负值。在每一种不同常量的描述中,你还可以找到在当前实现中该常量表示的值。不过你不应该依赖于这个数字。但是你可以相信所有的这些常量都是被定义为表示负值。

ECPG_INFORMIX_NUM_OVERFLOW

如果在一次计算中发生了溢出,函数会返回这个值。在内部它被定义为 -1200(Informix定义)。

ECPG_INFORMIX_NUM_UNDERFLOW

如果在一次计算中发生了下溢,函数会返回这个值。在内部它被定义为 -1201(Informix定义)。

ECPG_INFORMIX_DIVIDE_ZERO

如果发现尝试除零,函数会返回这个值。在内部它被定义为 -1202(Informix定义)。

ECPG_INFORMIX_BAD_YEAR

如果解析日期时发现无效的年份值,函数返回此值。其内部定义为 -1204(Informix的定义)。

ECPG_INFORMIX_BAD_MONTH

如果解析日期时发现无效的月份值,函数返回此值。其内部定义为 -1205(Informix的定义)。

ECPG_INFORMIX_BAD_DAY

如果解析日期时发现无效的日值,函数返回此值。其内部定义为 -1206(Informix的定义)。

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定义)。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。