华为云云数据库GaussDB访问特殊数据类型_云淘科技

ecpg支持numeric、decimal、date、timestamp和interval数据类型。由于这些数据类型的内部结构较为复杂,无法被映射到初级数据类型的宿主变量,因此应用程序通过声明特殊类型的宿主变量以及使用pgtypes库中的函数处理这些特殊类型。pgtypes库中的接口函数可参考ecpg接口参考章节。

timestamp, date

首先,程序必须包含timestamp类型的头文件:

#include 

其次,在声明部分中声明类型为timestamp的宿主变量:

EXEC SQL BEGIN DECLARE SECTION;
    timestamp ts;
EXEC SQL END DECLARE SECTION;

读取值到宿主变量之后,使用pgtypes库函数进行处理。如下示例中,使用PGTYPEStimestamp_to_asc()函数将timestamp值转换成文本形式:

EXEC SQL SELECT now()::timestamp INTO :ts;
printf("ts = %s
", PGTYPEStimestamp_to_asc(ts));

示例输出如下:

ts = 2022-06-27 18:03:56.949343

另外,date类型可以用相同的方式处理。程序必须包括pgtypes_data.h头文件,并声明一个date类型的宿主变量并用PGTYPEdata_to_asc()函数将其转换成文本形式。

interval

interval类型的处理与timestamp和date类型类似,不同的是interval类型变量的存储空间需要分配在堆内存中。

示例如下:

#include 
#include 
#include 
int main(void)
{
EXEC SQL BEGIN DECLARE SECTION;
    interval *in;
EXEC SQL END DECLARE SECTION;
    /* 连接数据库testdb, 需提前创建好testdb库 */
    EXEC SQL CONNECT TO testdb;
    in = PGTYPESinterval_new();
    EXEC SQL SELECT '1 min'::interval INTO :in;
    printf("interval = %s
", PGTYPESinterval_to_asc(in));
    PGTYPESinterval_free(in);
    EXEC SQL COMMIT;
    EXEC SQL DISCONNECT ALL;
    return 0;
}

numeric, decimal

numeric和decimal类型的处理类似于interval类型:需要定义一个指针,并在堆上分配一些内存空间并且使用pgtypes库函数访问该变量。

示例如下:

#include 
#include 
#include 
EXEC SQL WHENEVER SQLERROR STOP;
int main(void)
{
EXEC SQL BEGIN DECLARE SECTION;
    numeric *num;
    numeric *num2;
    decimal *dec;
EXEC SQL END DECLARE SECTION;
    
    /* 连接数据库testdb, 需提前创建好testdb库 */
    EXEC SQL CONNECT TO testdb;

    num = PGTYPESnumeric_new();
    dec = PGTYPESdecimal_new();

    EXEC SQL SELECT 12.345::numeric(4,2), 23.456::decimal(4,2) INTO :num, :dec;
    printf("numeric = %s
", PGTYPESnumeric_to_asc(num, 0));
    printf("numeric = %s
", PGTYPESnumeric_to_asc(num, 1));
    printf("numeric = %s
", PGTYPESnumeric_to_asc(num, 2));
    /*转换十进制到数值型以显示十进制值*/
    num2 = PGTYPESnumeric_new();
    PGTYPESnumeric_from_decimal(dec, num2);
    printf("decimal = %s
", PGTYPESnumeric_to_asc(num2, 0));
    printf("decimal = %s
", PGTYPESnumeric_to_asc(num2, 1));
    printf("decimal = %s
", PGTYPESnumeric_to_asc(num2, 2));
    PGTYPESnumeric_free(num2);
    PGTYPESdecimal_free(dec);
    PGTYPESnumeric_free(num);

    EXEC SQL COMMIT;
    EXEC SQL DISCONNECT ALL;
    return 0;
}

父主题: 宿主变量

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家