更新时间:2026-07-28 GMT+08:00
分享

使用库函数

ECPGdebug(int on, FILE *stream)

若函数第一个参数为非0,则开启调试日志,第二个参数表示要打印日志的标准输出流。调试日志在标准输出流上执行,日志包含所有输入的SQL语句以及来自GaussDB服务器的结果。

示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h"

int main()
{
    ECPGdebug(1, stderr);

    /* 需提前创建testdb */
    EXEC SQL CONNECT TO testdb;
    EXEC SQL SET AUTOCOMMIT TO ON;
    EXEC SQL CREATE TABLE T1(a int);
    return (0);
}

运行结果如下([23893]为线程ID,随机生成):

[23893]: ECPGdebug: set to 1
[23893]: ECPGconnect: opening database testdb on <DEFAULT> port <DEFAULT>
[23893]: ECPGsetcommit on line 12: action "on"; connection "testdb"
[23893]: ecpg_execute on line 13: query: create table T1 ( a int ); with 0 parameter(s) on connection testdb
[23893]: ecpg_execute on line 13: using PQexec
[23893]: ecpg_execute on line 13: OK: CREATE TABLE

ECPGget_PGconn(const char *connection_name)

返回由给定名称标识的数据库连接句柄。如果connection_name设置为NULL,则返回当前连接句柄。如果没有连接句柄可以被识别,则该函数返回NULL。

示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h"

int main()
{
    ECPGdebug(1, stderr);

    /* 需提前创建testdb数据库 */
    EXEC SQL CONNECT TO testdb as con1;
    EXEC SQL SET AUTOCOMMIT TO ON;
    EXEC SQL DROP TABLE IF EXISTS T1;
    PGconn     *conn;
    conn = ECPGget_PGconn("con1");
    printf("conn = %p\n", conn);
    conn = ECPGget_PGconn(NULL);
    printf("conn = %p\n", conn);
    EXEC SQL CREATE TABLE T1(a int);
    return (0);
}

运行结果如下([29709]为线程ID,随机生成。连接生成地址随机,运行结果不固定。):

[29709]: ECPGdebug: set to 1
[29709]: ECPGconnect: opening database testdb on <DEFAULT> port <DEFAULT>
[29709]: ECPGsetcommit on line 12: action "on"; connection "con1"
[29709]: ecpg_execute on line 13: query: drop table if exists T1; with 0 parameter(s) on connection con1
[29709]: ecpg_execute on line 13: using PQexec
[29709]: ecpg_execute on line 13: OK: DROP TABLE
conn = 0x14daf70
conn = 0x14daf70
[29709]: ecpg_execute on line 19: query: create table T1 ( a int ); with 0 parameter(s) on connection con1
[29709]: ecpg_execute on line 19: using PQexec
[29709]: ecpg_execute on line 19: OK: CREATE TABLE

ECPGtransactionStatus(const char *connection_name)

返回connection_name连接的当前事务状态。可能的返回值包括:
PQTRANS_IDLE,    /* connection idle,连接空闲 */
PQTRANS_ACTIVE,  /* command in progress,命令正在执行 */
PQTRANS_INTRANS, /* idle, within transaction block,空闲,在事务块里 */
PQTRANS_INERROR, /* idle, within failed transaction,空闲,在失败的事务里 */
PQTRANS_UNKNOWN  /* cannot determine status,未知状态 */
示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h"

int main()
{
    ECPGdebug(1, stderr);

    /* 需提前创建testdb数据库 */
    EXEC SQL CONNECT TO testdb as con1;
    EXEC SQL DROP TABLE IF EXISTS T1;
    int a = ECPGtransactionStatus("con1");
    printf("%d\n", a);
    EXEC SQL CREATE TABLE T1(a int);
    EXEC SQL COMMIT;
    return (0);
}

运行结果如下([44153]为线程ID,随机生成):

[44153]: ECPGdebug: set to 1
[44153]: ECPGconnect: opening database testdb on <DEFAULT> port <DEFAULT>
[44153]: ecpg_execute on line 12: query: drop table if exists T1; with 0 parameter(s) on connection con1
[44153]: ecpg_execute on line 12: using PQexec
[44153]: ecpg_execute on line 12: OK: DROP TABLE
2
[44153]: ecpg_execute on line 15: query: create table T1 ( a int ); with 0 parameter(s) on connection con1
[44153]: ecpg_execute on line 15: using PQexec
[44153]: ecpg_execute on line 15: OK: CREATE TABLE
[44153]: ECPGtrans on line 16: action "commit"; connection "con1"

ECPGfree_auto_mem()

释放为输出型宿主变量申请的所有内存,在程序结束时调用(return\exit)。

示例如下:

前提条件:需要提前创建testdb数据库。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlca.h"

int main()
{
   EXEC SQL BEGIN DECLARE SECTION;
   int *ip1=0;
   char **cp2=0;
   int *ipointer1=0;
   int *ipointer2=0;
   int column;
   EXEC SQL END DECLARE SECTION;
   int i;


   EXEC SQL WHENEVER SQLERROR DO sqlprint();
   EXEC SQL CONNECT TO testdb;

   /* 需提前创建testdb数据库 */
   EXEC SQL CREATE TABLE test (a int, b text);
   EXEC SQL INSERT INTO test VALUES (1, 'one');
   EXEC SQL INSERT INTO test VALUES (2, 'two');
   EXEC SQL INSERT INTO test VALUES (NULL, 'three');
   EXEC SQL INSERT INTO test VALUES (NULL, NULL);

   EXEC SQL ALLOCATE DESCRIPTOR mydesc;
   EXEC SQL SELECT * INTO SQL DESCRIPTOR mydesc FROM test;
   EXEC SQL GET DESCRIPTOR mydesc :column=COUNT;
   EXEC SQL GET DESCRIPTOR mydesc VALUE 1 :ip1=DATA, :ipointer1=INDICATOR;
   EXEC SQL GET DESCRIPTOR mydesc VALUE 2 :cp2=DATA, :ipointer2=INDICATOR;

   printf("Result (%d columns):\n", column);
   for (i=0;i < sqlca.sqlerrd[2];++i)
   {
      if (ipointer1[i]) printf("NULL, ");
      else printf("%d, ",ip1[i]);

      if (ipointer2[i]) printf("NULL, ");
      else printf("'%s', ",cp2[i]);
      printf("\n");
   }
   ECPGfree_auto_mem();
   printf("\n");

   EXEC SQL DEALLOCATE DESCRIPTOR mydesc;
   EXEC SQL ROLLBACK;
   EXEC SQL DISCONNECT;
   return 0;
}

运行结果如下:

Result (2 columns):
1, 'one',
2, 'two',
NULL, 'three',
NULL, NULL,

相关文档