
# 使用库函数
#### 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,
```
