当前位置: 首页 > news >正文

PostgreSql-学习06-libpq之同步命令处理

目录

一、环境

二、介绍

三、函数

1、PQsetdbLogin

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

2、PQfinish

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

3、PQreset

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

4、PQstatus

(1)作用

(2)声明

(3)参数介绍

(4)返回值

5、PQserverVersion

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

6、PQerrorMessage

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

7、PQbackendPID

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

8、PQprepare

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

9、PQresultStatus

(1)作用

(2)声明

(3)参数介绍

(4)返回值

10、PQclear

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

11、PQntuples

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

12、PQnfields

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

13、PQfname

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

14、PQftable

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

15、PQftype

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

16、PQfmod

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

17、PQfsize

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

18、PQgetvalue

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

19、PQgetisnull

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

20、PQnparams

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

21、PQparamtype

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

22、PQcmdTuples

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

23、PQexecPrepared

(1)作用

(2)声明

(3)参数介绍

(4)检测成功与否

四、封装Demo测试

1、Demo

2、测试效果


本文参考《PostgreSQL 15.7 手册之客户端接口》。

一、环境

名称描述
PGPostgreSQL 16.3
CPUIntel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz
OSCentOS Linux release 7.9.2009 (Core)

二、介绍

libpq是应用程序员使用PostgreSQL的C接口。libpq是一个库函数的集合,它们允许客户端程序传递查询给PostgreSQL后端服务器并且接收这些查询的结果。

libpq也是很多其他PostgreSQL应用接口的底层引擎,包括为 C++、Perl、Python、Tcl 和 ECPG编写的接口。

三、函数

libpq接口函数较多,本文只介绍自己封装用到的。

1、PQsetdbLogin

(1)作用

开启一个到数据库服务器的新连接。

(2)声明

PGconn *PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, const char *pgtty, const char *dbName, const char *login, const char *pwd)

(3)参数介绍

参数名描述
pghostIP地址
pgport数据库端口号
pgoptions指定连接开始时发送到服务器的命令行选项。例如,将其设置为-c geqo=off会将会话的geqo参数的值设置为off。 此字符串中的空格被视为分隔命令行参数,除非用反斜杠(\)转义;写\\表示字面上的反斜杠。 
pgtty已被弃用
dbName数据库名
login数据库用户名
pwd数据库密码

(4)检测成功与否

见PQstatus函数。

2、PQfinish

(1)作用

关闭与服务器的连接。同时释放PGconn对象使用的内存。

注意,即使与服务器的连接尝试失败(由PQstatus指示),应用也应当调用PQfinish来释放PGconn对象使用的内存。不能在调用PQfinish之后再使用PGconn指针。

(2)声明

void PQfinish(PGconn *conn)

(3)参数介绍

参数名描述
conn数据库连接结构体指针

(4)检测成功与否

3、PQreset

(1)作用

重置与服务器的通讯通道。

(2)声明

void PQreset(PGconn *conn)

(3)参数介绍

参数名描述
conn数据库连接结构体指针

(4)检测成功与否

4、PQstatus

(1)作用

返回该连接的状态。

(2)声明

ConnStatusType PQstatus(const PGconn *conn)

(3)参数介绍

参数名描述
conn数据库连接结构体指针

(4)返回值

描述
CONNECTION_OK数据库连接状态正常
CONNECTION_BAD数据库连接状态非正常
CONNECTION_STARTED等待连接建立
CONNECTION_MADE连接正常;等待发送
CONNECTION_AWAITING_RESPONSE等待来自postmaster的响应
CONNECTION_AUTH_OK收到认证信息;等待后端启动
CONNECTION_SETENV此状态不再使用
CONNECTION_SSL_STARTUP正在协商SSL
CONNECTION_NEEDED内部状态:需要connect()
CONNECTION_CHECK_WRITABLE检查会话是否为读写
CONNECTION_CONSUME消耗任何额外的消息
CONNECTION_GSS_STARTUP正在协商GSSAPI
CONNECTION_CHECK_TARGET检查目标服务器属性
CONNECTION_CHECK_STANDBY检查服务器是否处于备用模式

5、PQserverVersion

(1)作用

返回一个表示服务器版本的整数。

(2)声明

int PQserverVersion(const PGconn *conn)

(3)参数介绍

参数名描述
conn数据库连接结构体指针

(4)检测成功与否

无。

6、PQerrorMessage

(1)作用

返回连接上的一个操作最近产生的错误消息。

几乎所有的libpq在失败时都会为PQerrorMessage设置一个消息。 注意按照libpq习惯,一个非空PQerrorMessage结果由多行构成,并且将包括一个尾部新行。 调用者不应该直接释放结果。当相关的PGconn句柄被传递给PQfinish时,它将被释放。在PGconn结构上的多个操作之间,不能指望结果字符串会保持不变。

(2)声明

char *PQerrorMessage(const PGconn *conn)

(3)参数介绍

参数名描述
conn数据库连接结构体指针

(4)检测成功与否

7、PQbackendPID

(1)作用

返回处理这个连接的后端进程的进程ID(PID)。

后端PID有助于调试目的并且可用于与NOTIFY消息(它包括发出提示的后端进程的PID)进行比较。注意PID属于一个在数据库服务器主机上执行的进程,而不是本地主机进程!

(2)声明

int PQbackendPID(const PGconn *conn)

(3)参数介绍

参数名描述
conn数据库连接结构体指针

(4)检测成功与否

8、PQprepare

(1)作用

提交一个请求用给定参数创建一个预备语句并且等待完成。

PQprepare创建一个后面会由PQexecPrepared执行的预备语句。 这个特性允许命令被反复执行而无需每次都进行解析和规划。

该函数从query串创建一个名为stmtName的预备语句,该串必须包含一个单一 SQL 命令。 stmtName可以是""来创建一个未命名语句,在这种情况下任何已存在未命名语句将被自动替换。 如果语句名称已经在当前会话中被定义,则是一种错误。如果使用了任何参数,它们在查询中以$1、$2等引用。 nParams是参数的个数,其类型在数组paramTypes[]中被预先指定(当nParams为零时,该数组指针可以是NULL)。 paramTypes[]通过 OID 指定要赋予给参数符号的数据类型。 如果paramTypes是NULL或者该数组中任何特定元素为零,服务器会用对待未知类型文字串的方式为参数符号推测一种数据类型。 还有,查询能够使用编号高于nParams的参数符号,它们的数据类型也会被自动推测(找出推测出的数据类型的方法见PQdescribePrepared)。

正如PQexec一样,结果通常是一个PGresult对象,其内容代表服务器端成功或失败。 一个空结果表示内存不足或者根本无法发送命令。关于错误的更多信息请见PQerrorMessage。

用于PQexecPrepared的预备语句也能通过执行 SQL PREPARE语句来创建。 还有,尽管没有libpq函数来删除一个预备语句,SQL DEALLOCATE语句可被用于此目的。

(2)声明

PGresult *PQprepare(PGconn *conn, const char *stmtName, const char *query, int nParams, const Oid *paramTypes)

(3)参数介绍

参数名描述
conn数据库连接结构体指针
stmtName语句句柄名
query执行语句
nParams参数个数
paramTypes参数类型

(4)检测成功与否

见PQresultStatus函数。

9、PQresultStatus

(1)作用

返回该命令的结果状态。

如果结果状态是PGRES_TUPLES_OK或者PGRES_SINGLE_TUPLE,那么下面所描述的函数能被用来检索该查询所返回的行。注意,一个恰好检索零行的SELECT命令仍然会显示PGRES_TUPLES_OKPGRES_COMMAND_OK用于从不返回行的命令(不带RETURNING子句的INSERT或者UPDATE等)。一个PGRES_EMPTY_QUERY可能表示客户端软件中的一个缺陷。

一个状态为PGRES_NONFATAL_ERROR的结果将不会被PQexec或者其他查询执行函数直接返回,这类结果将被传递给提示处理器。

(2)声明

ExecStatusType PQresultStatus(const PGresult *res)

(3)参数介绍

参数名描述
res结构体指针

(4)返回值

描述
PGRES_EMPTY_QUERY发送给服务器的字符串为空。
PGRES_COMMAND_OK一个不返回数据的命令成功完成。
PGRES_TUPLES_OK一个返回数据的命令(例如SELECT或者SHOW)成功完成。
PGRES_COPY_OUT从服务器复制出数据的传输开始。
PGRES_COPY_IN复制数据到服务器的传输开始。
PGRES_BAD_RESPONSE从后端收到意外响应
PGRES_NONFATAL_ERROR发生了一次非致命错误(一个提示或警告)。
PGRES_FATAL_ERROR发生了一次致命错误。
PGRES_COPY_BOTH向服务器复制数据/从服务器复制数据的传输开始。这个特性当前只被用于流复制,因此这个状态应该不会在普通应用中出现。
PGRES_SINGLE_TUPLEPGresult包含来自于当前命令的一个单一结果元组。这个状态只在查询选择了单一行模式时发生
PGRES_PIPELINE_SYNCPGresult表示管道模式中的同步点,由PQpipelineSync请求。 此状态仅在选择管道模式时发生。
PGRES_PIPELINE_ABORTEDPGresult表示从服务器接收到错误的管道。 PQgetResult必须被重复调用,并且每次它都会返回这个状态码,直到当前管道结束,此时它将返回PGRES_PIPELINE_SYNC,并且正常的处理可以继续。

10、PQclear

(1)作用

释放与一个PGresult相关的内存。

每一个命令结果不再需要时应该用PQclear释放。

你可以按照需要保留PGresult对象,当你发出一个新命令时它也不会消失,甚至关闭连接时也不会消失。 要去掉它,你必须调用PQclear。没有这样做将会导致在应用中的内存泄露。

(2)声明

void PQclear(PGresult *res)

(3)参数介绍

参数名描述
res结构体指针

(4)检测成功与否

11、PQntuples

(1)作用

返回查询结果中的行(元组)数(注意,PGresult对象被限制为不超过INT_MAX行,因此一个int结果就足够了)。

(2)声明

int PQntuples(const PGresult *res)

(3)参数介绍

参数名描述
res结构体指针

(4)检测成功与否

12、PQnfields

(1)作用

返回查询结果中每一行的列(域)数。

(2)声明

int PQnfields(const PGresult *res)

(3)参数介绍

参数名描述
res结构体指针

(4)检测成功与否

13、PQfname

(1)作用

返回与给定列号相关联的列名。

调用者不应该直接释放该结果。它将在相关的PGresult句柄被传递给PQclear之后被释放。

(2)声明

char *PQfname(const PGresult *res, int field_num)

(3)参数介绍

参数名描述
res结构体指针
field_num列号,从 0 开始。

(4)检测成功与否

14、PQftable

(1)作用

返回给定列从中取出的表的 OID。列号从 0 开始。

如果列号超出范围或者指定的列不是对一个表列的简单引用时,返回InvalidOid。 你可以查询系统表pg_class来确定究竟是哪个表被引用。

当你包括libpq头文件,类型oid以及常数InvalidOid将被定义。它们将都是某种整数类型。

(2)声明

Oid PQftable(const PGresult *res, int field_num)

(3)参数介绍

参数名描述
res结构体指针
field_num列号,从 0 开始。

(4)检测成功与否

15、PQftype

(1)作用

返回与给定列号相关联的数据类型。被返回的整数是该类型的内部 OID 号。列号从 0 开始。

你可以查询系统表pg_type来得到多个数据类型的名字和属性。 内建数据类型的OID被定义在PostgreSQL安装的include目录中的catalog/pg_type_d.h文件中。

(2)声明

Oid PQftype(const PGresult *res, int field_num)

(3)参数介绍

参数名描述
res结构体指针
field_num列号,从 0 开始。

(4)检测成功与否

16、PQfmod

(1)作用

返回与给定列号相关联的列的修饰符类型。列号从 0 开始。

修饰符值的解释是与类型相关的,它们通常指示精度或尺寸限制。值 -1 被用来指示“没有信息可用”。大部分的数据类型不适用修饰符,在那种情况中值总是 -1。

(2)声明

int PQfmod(const PGresult *res, int field_num)

(3)参数介绍

参数名描述
res结构体指针
field_num列号,从 0 开始。

(4)检测成功与否

17、PQfsize

(1)作用

返回与给定列号相关的列的尺寸(以字节计)。列号从 0 开始。

PQfsize返回在一个数据库行中为这个列分配的空间,换句话说是服务器对该数据类型的内部表示的尺寸(因此,它对客户端并不是真地非常有用)。一个负值指示该数据类型是变长的。

(2)声明

int PQfsize(const PGresult *res, int field_num)

(3)参数介绍

参数名描述
res结构体指针
field_num列号,从 0 开始。

(4)检测成功与否

18、PQgetvalue

(1)作用

返回一个PGresult的一行的单一域值。行和列号从 0 开始。调用者不应该直接释放该结果。 它将在相关的PGresult句柄被传递给PQclear之后被释放。

对于文本格式的数据,PQgetvalue返回的值是该域值的一种空值结束的字符串表示。对于二进制格式的数据,该值是由该数据类型的typsendtypreceive函数决定的二进制表示(在这种情况下该值实际上也跟随着一个零字节,但是这通常没有用处,因为该值很可能包含嵌入的空)。

如果该域值为空,则返回一个空串。关于区分空值和空字符串值请见PQgetisnull。

PQgetvalue返回的指针指向作为PGresult结构一部分的存储。我们不应该修改它指向的数据,并且如果要在超过PGresult结构本身的生命期之外使用它,我们必须显式地把该数据拷贝到其他存储中。

(2)声明

char *PQgetvalue(const PGresult *res, int tup_num, int field_num)

(3)参数介绍

参数名描述
res结构体指针
tup_num行号,从 0 开始。
field_num列号,从 0 开始。

(4)检测成功与否

19、PQgetisnull

(1)作用

测试一个域是否为空值。行号和列号从 0 开始。

如果该域是空,这个函数返回 1。如果它包含一个非空值,则返回 0(注意PQgetvalue将为一个空域返回一个空串,不是一个空指针)。

(2)声明

int PQgetisnull(const PGresult *res, int tup_num, int field_num)

(3)参数介绍

参数名描述
res结构体指针
tup_num行号,从 0 开始。
field_num列号,从 0 开始。

(4)检测成功与否

20、PQnparams

(1)作用

返回一个预备语句的参数数量。

只有在查看PQdescribePrepared的结果时,这个函数才有用。对于其他类型的查询,它将返回零。

(2)声明

int PQnparams(const PGresult *res)

(3)参数介绍

参数名描述
res结构体指针

(4)检测成功与否

21、PQparamtype

(1)作用

返回所指示的语句参数的数据类型。参数号从 0 开始。

只有在查看PQdescribePrepared的结果时,这个函数才有用。对于其他类型的查询,它将返回零。

(2)声明

Oid PQparamtype(const PGresult *res, int param_num)

(3)参数介绍

参数名描述
res结构体指针
param_num参数号,从 0 开始。

(4)检测成功与否

22、PQcmdTuples

(1)作用

返回受该 SQL 命令影响的行数。

该函数返回一个字符串,其中包含由生成PGresult的SQL语句影响的行数。 该函数只能在执行SELECTCREATE TABLE AS、 INSERTUPDATEDELETE、 MERGEMOVEFETCHCOPY语句, 或包含INSERTUPDATEDELETEMERGE语句的预处理查询的EXECUTE之后使用。 如果生成PGresult的命令是其他任何命令,PQcmdTuples将返回一个空字符串。 调用者不应直接释放返回值。当关联的PGresult句柄传递给PQclear时,它将被释放。

(2)声明

char *PQcmdTuples(PGresult *res)

(3)参数介绍

参数名描述
res结构体指针

(4)检测成功与否

23、PQexecPrepared

(1)作用

发送一个请求来执行一个带有给定参数的预处理语句,并等待结果。

PQexecPrepared类似于PQexecParams, 但要执行的命令是通过指定先前准备好的语句来指定,而不是提供查询字符串。 此功能允许重复使用的命令只被解析和计划一次,而不是每次执行时都要进行。 该语句必须在当前会话中先前准备好。

参数与PQexecParams相同,只是给出了预处理语句的名称而不是查询字符串, 并且paramTypes[]参数不存在(因为在创建预处理语句时已确定了参数类型)。

(2)声明

PGresult *PQexecPrepared(PGconn *conn, const char *stmtName, int nParams, const char *const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat)

(3)参数介绍

参数名描述
conn数据库连接结构体
stmtName句柄名
nParams参数个数
paramValues参数值
paramLengths参数长度
paramFormats指定参数是否为文本(在参数相应的数组项中放一个零)或二进制(在参数相应的数组项中放一个一)。如果该数组指针为空,那么所有参数都会被假定为文本串。
以二进制格式传递的值要求后端所期待的内部表示形式的知识。例如,整数必须以网络字节序被传递。传递numeric值要求关于服务器存储格式的知识,正如src/backend/utils/adt/numeric.c::numeric_send()以及src/backend/utils/adt/numeric.c::numeric_recv()中所实现的。
resultFormat指定零来得到文本格式的结果,或者指定一来得到二进制格式的结果(目前没有规定要求以不同格式得到不同的结果列,尽管在底层协议中这是可以实现的)。

(4)检测成功与否

四、封装Demo测试

1、Demo

#include "PgDb.h"#define TEST_PARAM_NUMS      100
#define TEST_PARAM_DATA_LEN  30
#define TEST_DATA_ROWS       3
#define TEST_DATA_COLS       8
#define TEST_DATA_SIZE       50
#define TEST_DELIMITER       '|'
#define TEST_NULL            ""
#define TEST_QUTO            '"'
#define TEST_ESCAPE          '\\'Status main()
{LOG_LEVEL = Debug;MyPgSt     *PgSt         = NULL;PgConnSt   PgConnInfo    = PG_CONN_ST_INIT("192.168.142.12","5432","","czg","postgres","postgres","UTF8");CopyStr    *Sql          = NULL;int        ParamNums;char       **ParamValues = (char **)MyMalloc(sizeof(char *) * TEST_PARAM_NUMS);int        i;int        j;Status     MyStatus      = FAIL_FLAG;for ( ParamNums = 0; ParamNums < TEST_PARAM_NUMS; ParamNums++){ParamValues[ParamNums] = (char *)MyMalloc(sizeof(char) * TEST_PARAM_DATA_LEN);}InitCopyStr(&Sql); PgInit(&PgSt);if (PgConn(&PgConnInfo,PgSt) != SUCCESS_FLAG){goto ERR_PHASE;}/*同步函数测试*//*开启事务,也就相当于非自动提交*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"BEGIN;\n");if (PG_EXEC_SQL(PgSt,Sql->String) != SUCCESS_FLAG){goto ERR_PHASE;}/*执行查询SQL文本DDL*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"\n\
CREATE TABLE IF NOT EXISTS PUBLIC.TESTTAB(\n\A       SERIAL PRIMARY KEY          ,\n\B       DOUBLE PRECISION            ,\n\C       CHARACTER VARYING(100)      ,\n\D       TEXT                        ,\n\E       BYTEA                       ,\n\F       BYTEA                       ,\n\G       DATE                        ,\n\H       TIMESTAMP WITHOUT TIME ZONE ,\n\I       NUMERIC(10,2)               );\n");if (PG_EXEC_SQL(PgSt,Sql->String) != SUCCESS_FLAG){goto ERR_PHASE;}/*执行COPY文本*/PG_COPY_SPLICING(Sql,"PUBLIC","TESTTAB","B,C,D,E,F,G,H,I","FROM","'/home/postgres/PgData.txt'","CSV",TEST_DELIMITER,TEST_NULL,TEST_QUTO,TEST_ESCAPE);if (PG_EXEC_SQL(PgSt,Sql->String) != SUCCESS_FLAG){goto ERR_PHASE;}/*执行查询SQL文本DQL*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"SELECT * FROM PUBLIC.TESTTAB ORDER BY A DESC LIMIT 10;\n");if (PG_EXEC_SQL(PgSt,Sql->String) != SUCCESS_FLAG){goto ERR_PHASE;}PgResDataPrint(PgSt, Debug);PG_DQL_FREE(PgSt);/*执行插入SQL文本*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES(2.1,'LXG''ZXJ|CLX','HAHHAHAH','AAAAAA','BBBBBBBBBBBB','2024-08-19','2024-08-19',8);\n");if (PG_EXEC_SQL(PgSt,Sql->String) != SUCCESS_FLAG){goto ERR_PHASE;}/*执行查询SQL绑定变量方式*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"SELECT * FROM PUBLIC.TESTTAB WHERE B = $1 ORDER BY A DESC LIMIT 10;\n");ParamNums = 1;strcpy(ParamValues[0],"1.1");if (PG_EXEC_SQL_PREPARE(PgSt,Sql->String,ParamNums,(const char * const*)ParamValues) != SUCCESS_FLAG){goto ERR_PHASE;}PgResDataPrint(PgSt, Debug);PG_DQL_FREE(PgSt);/*执行查询SQL绑定变量方式,复用上一次的解析结果*/ParamNums = 1;strcpy(ParamValues[0],"3.1");if (PG_EXEC_SQL_REUSE(PgSt,Sql->String,ParamNums,(const char * const*)ParamValues) != SUCCESS_FLAG){goto ERR_PHASE;}PgResDataPrint(PgSt, Debug);PG_DQL_FREE(PgSt);/*执行插入SQL绑定变量方式*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES($1,$2,$3,$4,$5,$6,$7,$8),($9,$10,$11,$12,$13,$14,$15,$16);\n");ParamNums = 16;const char * const ParamValues3[] = {"4.1","LXG''ZXJ|CLX","HAHHAHAH","AAAAAA","BBBBBBBBBBBB","2024-08-19","2024-08-19","8","5.1","LXG''ZXJ|CLX","HAHHAHAH","AAAAAA","BBBBBBBBBBBB","2024-08-19","2024-08-19","8"};for ( i = 0; i < ParamNums; i++){strcpy(ParamValues[i],ParamValues3[i]);}if (PG_EXEC_SQL_PREPARE(PgSt,Sql->String,ParamNums,(const char * const*)ParamValues) != SUCCESS_FLAG){goto ERR_PHASE;}/*执行插入SQL绑定变量方式,复用解析*/ParamNums = 16;const char * const ParamValues4[] = {"6.1","LXG''ZXJ|CLX","HAHHAHAH","AAAAAA","BBBBBBBBBBBB","2024-08-19","2024-08-19","8","7.1","LXG''ZXJ|CLX","HAHHAHAH","AAAAAA","BBBBBBBBBBBB","2024-08-19","2024-08-19","8"};for ( i = 0; i < ParamNums; i++){strcpy(ParamValues[i],ParamValues4[i]);}if (PG_EXEC_SQL_REUSE(PgSt,Sql->String,ParamNums,(const char * const*)ParamValues) != SUCCESS_FLAG){goto ERR_PHASE;}/*异步函数测试*//*执行插入SQL文本*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES(2.1,'LXG''ZXJ|CLX','HAHHAHAH','AAAAAA','BBBBBBBBBBBB','2024-08-19','2024-08-19',8);\n");MyStatus = PG_EXEC_SQL_ASYNC(PgSt,Sql->String);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*执行查询SQL绑定变量方式*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"SELECT * FROM PUBLIC.TESTTAB WHERE B = $1 ORDER BY A DESC LIMIT 10;\n");ParamNums = 1;strcpy(ParamValues[0],"1.1");MyStatus = PG_EXEC_SQL_PREPARE_ASYNC(PgSt,Sql->String,ParamNums,(const char * const*)ParamValues);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}else if (MyStatus == SUCCESS_FLAG){PgResDataPrintAsync(PgSt, Debug);}/*执行查询SQL绑定变量方式,复用解析*/ParamNums = 1;strcpy(ParamValues[0],"3.1");MyStatus = PG_EXEC_SQL_REUSE_ASYNC(PgSt,Sql->String,ParamNums,(const char * const*)ParamValues);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}else if (MyStatus == SUCCESS_FLAG){PgResDataPrintAsync(PgSt, Debug);}/*执行COPY文本*/PG_COPY_SPLICING(Sql,"PUBLIC","TESTTAB","B,C,D,E,F,G,H,I","FROM","'/home/postgres/PgData.txt'","CSV",TEST_DELIMITER,TEST_NULL,TEST_QUTO,TEST_ESCAPE);MyStatus = PG_EXEC_SQL_ASYNC(PgSt,Sql->String);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*执行COPY IN文本,目前只有PG_EXEC_SQL_ASYNC支持*//*\进行转义,例如:"1LXG'ZXJ|\"CLX",这只是C定义的时候的时候需要。*//*\进行转义,例如:"\\x414141414141",第一个\是C定义的时候的时候需要。*/char CopyData[TEST_DATA_ROWS][TEST_DATA_COLS][TEST_DATA_SIZE] = \{{"18.1","1LXG'ZXJ|\"CLX","HAHHAHAH","\\x414141414141","","2024-08-19","2024-08-19 00:00:00","8.00"},{"18.1","2LXG'ZXJ|\"CLX","HAHHAHAH","\\x414141414141","\\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"},{"18.1","","HAHHAHAH","","\\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"}};/*测试demo,Data就不释放内存了,由系统自动释放,偷个懒。*/char ***Data = (char ***)MyMalloc(sizeof(char **) * TEST_DATA_ROWS);for ( i = 0; i < TEST_DATA_ROWS; i++){Data[i] = (char **)MyMalloc(sizeof(char *) * TEST_DATA_COLS);for ( j = 0; j < TEST_DATA_COLS; j++){Data[i][j] = (char *)MyMalloc(sizeof(char) * TEST_DATA_SIZE);strcpy(Data[i][j],CopyData[i][j]);}}Oid ColTypeArray[TEST_DATA_COLS] = {701,1043,25,17,17,1082,1114,1700};PG_COPY_SPLICING(Sql,"PUBLIC","TESTTAB","B,C,D,E,F,G,H,I","FROM","STDIN","CSV",TEST_DELIMITER,TEST_NULL,TEST_QUTO,TEST_ESCAPE);MyStatus = PG_EXEC_SQL_ASYNC(PgSt,Sql->String);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}MyStatus = PgCopyIn(PgSt,Data,TEST_DATA_ROWS,TEST_DATA_COLS,TEST_DELIMITER,TEST_NULL,TEST_QUTO,TEST_ESCAPE,ColTypeArray);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}MyStatus = PgCopyInEnd(PgSt);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*执行提交SQL文本*/ClearCopyStr(Sql,0);ExecCopyStr(Sql,"COMMIT;\n");MyStatus = PG_EXEC_SQL_ASYNC(PgSt,Sql->String);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*测试某库某模式下所有主键表获取*/MyStatus = PgSchemaPkGet(PgSt,"czg","public");if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}else if (MyStatus == SUCCESS_FLAG){PgResDataPrintAsync(PgSt, Debug);}/*测试某库某模式下主键表获取*/MyStatus = PgTabPkGet(PgSt,"czg","public","testtab");if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}else if (MyStatus == SUCCESS_FLAG){PgResDataPrintAsync(PgSt, Debug);}/*测试PG根据主键切分表,返回主键最大值,最小值,步长等信息。*/PgPkSplitSt PkSplitInfo;MyStatus = PgTabPkSplit(PgSt,"a","public","testtab","",6,&PkSplitInfo);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*测试PG计算单表条数。*/MyStatus = PgCntSingleTab(PgSt,"public","testtab","",&i);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*测试PG导出文本。*/PG_COPY_SPLICING(Sql,"PUBLIC","TESTTAB","B,C,D,E,F,G,H,I","TO","'/home/postgres/PgDataOut.txt'","CSV",TEST_DELIMITER,TEST_NULL,TEST_QUTO,TEST_ESCAPE);MyStatus = PG_EXEC_SQL_ASYNC(PgSt,Sql->String);if (MyStatus == FAIL_FLAG){goto ERR_PHASE;}/*释放内存资源*/
ERR_PHASE:DestroyCopyStr(&Sql); PgDestroy(&PgSt);for ( ParamNums = 0; ParamNums < TEST_PARAM_NUMS; ParamNums++){free(ParamValues[ParamNums]);ParamValues[ParamNums] = NULL;}free(ParamValues);ParamValues = NULL;return MyStatus;
}

2、测试效果

下一次和大家分享一下异步模式,Demo中对异步命令处理进行封装,获取元数据阶段是同步的,执行SQL,获取查询数据等都是异步处理的。

[gbase@czg2 Exec]$ ./TestPg 
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgInit             : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : SELECT PG_CATALOG.SET_CONFIG('search_path', '', false);
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSqlAsync     : OK, Elapsed Time    0.001 s, Affect          0 Rows.(SELECT,SHOW)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 1
AffectRows : 0
ID  ColName                        ColType ColTypeSize ColMod TabOid 
0   set_config                     25      -1          -1     0
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgParamSet         : OK, ParamName : 'search_path', ParamVal : '', ParamLv : 0
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgConn             : OK, Host : '192.168.142.12', User : 'postgres', Db : 'czg', Port : '5432', Encode : 'UTF8', BackendPid : 33856, PqlibV : 160003, PgV : 160003, PqThrdSafe : 1.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : BEGIN;
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql          : OK, Sql Elapsed Time    0.000 s, Affect          0 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 0
AffectRows : 0
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : 
CREATE TABLE IF NOT EXISTS PUBLIC.TESTTAB(A       SERIAL PRIMARY KEY          ,B       DOUBLE PRECISION            ,C       CHARACTER VARYING(100)      ,D       TEXT                        ,E       BYTEA                       ,F       BYTEA                       ,G       DATE                        ,H       TIMESTAMP WITHOUT TIME ZONE ,I       NUMERIC(10,2)               );
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Warn ]-MyNoticeProcessor  : OK, NOTICE:  42P07: relation "testtab" already exists, skipping
LOCATION:  transformCreateStmt, parse_utilcmd.c:207
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql          : OK, Sql Elapsed Time    0.001 s, Affect          0 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 0
AffectRows : 0
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : 
COPY PUBLIC.TESTTAB(B,C,D,E,F,G,H,I)FROM '/home/postgres/PgData.txt'WITH(FORMAT    CSV,DELIMITER '|',NULL      '',QUOTE     '"',ESCAPE    '\');
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql          : OK, Sql Elapsed Time    0.002 s, Affect         10 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 0
AffectRows : 10
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : SELECT * FROM PUBLIC.TESTTAB ORDER BY A DESC LIMIT 10;
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql          : OK, Sql Elapsed Time    0.002 s, Affect         10 Rows.(SELECT,SHOW)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 10
ColNums    : 9
AffectRows : 10
ID  ColName                        ColType ColTypeSize ColMod TabOid 
0   a                              23      4           -1     16414
1   b                              701     8           -1     16414
2   c                              1043    -1          104    16414
3   d                              25      -1          -1     16414
4   e                              17      -1          -1     16414
5   f                              17      -1          -1     16414
6   g                              1082    4           -1     16414
7   h                              1114    8           -1     16414
8   i                              1700    -1          655366 16414
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgResDataPrint     :
"2099372","9.1","0LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099371","9.1","9LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099370","9.1","8LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099369","9.1","7LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099368","9.1","6LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099367","9.1","5LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099366","9.1","4LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099365","9.1","3LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099364","9.1","2LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2099363","9.1","1LXG'ZXJ|"CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242",NULL,"2024-08-19 00:00:00","8.00"
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES(2.1,'LXG''ZXJ|CLX','HAHHAHAH','AAAAAA','BBBBBBBBBBBB','2024-08-19','2024-08-19',8);
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql          : OK, Sql Elapsed Time    0.001 s, Affect          1 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 0
AffectRows : 1
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : SELECT * FROM PUBLIC.TESTTAB WHERE B = $1 ORDER BY A DESC LIMIT 10;
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql          : OK, Sql Elapsed Time    0.002 s, Affect         10 Rows.(SELECT,SHOW)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 10
ColNums    : 9
AffectRows : 10
ID  ColName                        ColType ColTypeSize ColMod TabOid 
0   a                              23      4           -1     16414
1   b                              701     8           -1     16414
2   c                              1043    -1          104    16414
3   d                              25      -1          -1     16414
4   e                              17      -1          -1     16414
5   f                              17      -1          -1     16414
6   g                              1082    4           -1     16414
7   h                              1114    8           -1     16414
8   i                              1700    -1          655366 16414
ParamNums  : 1
ParamType  : [ 701 ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgResDataPrint     :
"2097152","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097151","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097150","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097149","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097148","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097147","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097146","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097145","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097144","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097143","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : SELECT * FROM PUBLIC.TESTTAB WHERE B = $1 ORDER BY A DESC LIMIT 10;
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql          : OK, Sql Elapsed Time    0.233 s, Affect          0 Rows.(SELECT,SHOW)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgResDataPrint     :
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES($1,$2,$3,$4,$5,$6,$7,$8),($9,$10,$11,$12,$13,$14,$15,$16);
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql          : OK, Sql Elapsed Time    0.001 s, Affect          2 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 0
AffectRows : 2
ParamNums  : 16
ParamType  : [ 701,1043,25,17,17,1082,1114,1700,701,1043,25,17,17,1082,1114,1700 ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES($1,$2,$3,$4,$5,$6,$7,$8),($9,$10,$11,$12,$13,$14,$15,$16);
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSql          : OK, Sql Elapsed Time    0.001 s, Affect          2 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : INSERT INTO PUBLIC.TESTTAB(b,c,d,e,f,g,h,i) VALUES(2.1,'LXG''ZXJ|CLX','HAHHAHAH','AAAAAA','BBBBBBBBBBBB','2024-08-19','2024-08-19',8);
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSqlAsync     : OK, Elapsed Time    0.001 s, Affect          1 Rows. (DML,DDL,COPY)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 0
AffectRows : 1
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : SELECT * FROM PUBLIC.TESTTAB WHERE B = $1 ORDER BY A DESC LIMIT 10;
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-PgExecSqlAsync     : OK, Elapsed Time    0.001 s, Affect          0 Rows.(SELECT,SHOW)
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 9
AffectRows : 0
ID  ColName                        ColType ColTypeSize ColMod TabOid 
0   a                              23      4           -1     16414
1   b                              701     8           -1     16414
2   c                              1043    -1          104    16414
3   d                              25      -1          -1     16414
4   e                              17      -1          -1     16414
5   f                              17      -1          -1     16414
6   g                              1082    4           -1     16414
7   h                              1114    8           -1     16414
8   i                              1700    -1          655366 16414
ParamNums  : 1
ParamType  : [ 701 ]
2024-11-18 16:16:10-P[33855]-T[33855]-[Debug]-PgResDataPrintAsync:
"2097152","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097151","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097150","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097149","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097148","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097147","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097146","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097145","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097144","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
"2097143","1.1","LXG'ZXJ|CLX","HAHHAHAH","\x414141414141","\x424242424242424242424242","2024-08-19","2024-08-19 00:00:00","8.00"
RowNums : 10
2024-11-18 16:16:10-P[33855]-T[33855]-[Extra]-Sql Query          : SELECT * FROM PUBLIC.TESTTAB WHERE B = $1 ORDER BY A DESC LIMIT 10;
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync     : OK, Elapsed Time    0.214 s, Affect          0 Rows.(SELECT,SHOW,No Data)
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query          : 
COPY PUBLIC.TESTTAB(B,C,D,E,F,G,H,I)FROM '/home/postgres/PgData.txt'WITH(FORMAT    CSV,DELIMITER '|',NULL      '',QUOTE     '"',ESCAPE    '\');
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync     : OK, Elapsed Time    0.000 s, Affect         10 Rows. (DML,DDL,COPY)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 0
AffectRows : 10
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query          : 
COPY PUBLIC.TESTTAB(B,C,D,E,F,G,H,I)FROM STDINWITH(FORMAT    CSV,DELIMITER '|',NULL      '',QUOTE     '"',ESCAPE    '\');
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync     : OK, Elapsed Time    0.001 s, Affect          0 Rows.(SELECT,SHOW,COPY IN)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 0
AffectRows : 0
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgCopyIn           : OK, RowNums : 3.
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgCopyInEnd        : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query          : COMMIT;
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync     : OK, Elapsed Time    0.001 s, Affect          0 Rows. (DML,DDL,COPY)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 0
AffectRows : 0
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query          : 
SELECTPkTab.TABLE_NAME,STRING_AGG(PkTab.COLUMN_NAME,'|'),STRING_AGG(ColTab.DATA_TYPE,'|'),COUNT(PkTab.COLUMN_NAME)
FROM
(SELECTTABLE_CATALOG,TABLE_SCHEMA ,TABLE_NAME   ,COLUMN_NAMEFROMINFORMATION_SCHEMA.KEY_COLUMN_USAGEWHERETABLE_CATALOG = $1ANDTABLE_SCHEMA  = $2ANDPOSITION_IN_UNIQUE_CONSTRAINT IS NULLORDER BY ORDINAL_POSITION
) PkTab
LEFT JOIN
(SELECTTABLE_CATALOG,TABLE_SCHEMA ,TABLE_NAME   ,COLUMN_NAME  ,DATA_TYPEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_CATALOG = $3ANDTABLE_SCHEMA  = $4
) ColTab
ONPkTab.TABLE_CATALOG = ColTab.TABLE_CATALOG
ANDPkTab.TABLE_SCHEMA  = ColTab.TABLE_SCHEMA
ANDPkTab.TABLE_NAME    = ColTab.TABLE_NAME
ANDPkTab.COLUMN_NAME   = ColTab.COLUMN_NAME
GROUP BYPkTab.TABLE_NAME;
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync     : OK, Elapsed Time    0.021 s, Affect          0 Rows.(SELECT,SHOW)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 4
AffectRows : 0
ID  ColName                        ColType ColTypeSize ColMod TabOid 
0   table_name                     19      64          -1     14040
1   string_agg                     25      -1          -1     0
2   string_agg                     25      -1          -1     0
3   count                          20      8           -1     0
ParamNums  : 4
ParamType  : [ 19,19,19,19 ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgSchemaPkGet      : OK, czg.public.
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgResDataPrintAsync:
"students","id|name","integer|character varying","2"
"testtab","a","integer","1"
RowNums : 2
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query          : 
SELECTSTRING_AGG(PkTab.COLUMN_NAME,'|'),STRING_AGG(ColTab.DATA_TYPE,'|'),COUNT(PkTab.COLUMN_NAME)
FROM
(SELECTTABLE_CATALOG,TABLE_SCHEMA ,TABLE_NAME   ,COLUMN_NAMEFROMINFORMATION_SCHEMA.KEY_COLUMN_USAGEWHERETABLE_CATALOG = $1ANDTABLE_SCHEMA  = $2ANDTABLE_NAME    = $3ANDPOSITION_IN_UNIQUE_CONSTRAINT IS NULLORDER BY ORDINAL_POSITION
) PkTab
LEFT JOIN
(SELECTTABLE_CATALOG,TABLE_SCHEMA ,TABLE_NAME   ,COLUMN_NAME  ,DATA_TYPEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_CATALOG = $4ANDTABLE_SCHEMA  = $5ANDTABLE_NAME    = $6
) ColTab
ONPkTab.TABLE_CATALOG = ColTab.TABLE_CATALOG
ANDPkTab.TABLE_SCHEMA  = ColTab.TABLE_SCHEMA
ANDPkTab.TABLE_NAME    = ColTab.TABLE_NAME
ANDPkTab.COLUMN_NAME   = ColTab.COLUMN_NAME
GROUP BYPkTab.TABLE_NAME;
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync     : OK, Elapsed Time    0.010 s, Affect          0 Rows.(SELECT,SHOW)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 3
AffectRows : 0
ID  ColName                        ColType ColTypeSize ColMod TabOid 
0   string_agg                     25      -1          -1     0
1   string_agg                     25      -1          -1     0
2   count                          20      8           -1     0
ParamNums  : 6
ParamType  : [ 19,19,19,19,19,19 ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgTabPkGet         : OK, czg.public.testtab
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgResDataPrintAsync:
"a","integer","1"
RowNums : 1
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query          : SELECT MAX(a),MIN(a) FROM public.testtab
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync     : OK, Elapsed Time    0.002 s, Affect          0 Rows.(SELECT,SHOW)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 2
AffectRows : 0
ID  ColName                        ColType ColTypeSize ColMod TabOid 
0   max                            23      4           -1     0
1   min                            23      4           -1     0
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgTabPkSplit       : OK, Schema : public, Tab : testtab, Pk : a.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query          : SELECT COUNT(*) FROM public.testtab
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgExecSqlAsync     : OK, Elapsed Time    0.167 s, Affect          0 Rows.(SELECT,SHOW)
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 1
AffectRows : 0
ID  ColName                        ColType ColTypeSize ColMod TabOid 
0   count                          20      8           -1     0
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:11-P[33855]-T[33855]-[Debug]-PgCntSingleTab     : OK, Schema : public, Tab : testtab, RowNums : 2098355.
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-Sql Query          : 
COPY PUBLIC.TESTTAB(B,C,D,E,F,G,H,I)TO '/home/postgres/PgDataOut.txt'WITH(FORMAT    CSV,DELIMITER '|',NULL      '',QUOTE     '"',ESCAPE    '\');
2024-11-18 16:16:11-P[33855]-T[33855]-[Extra]-PgMetaDataGet      : OK.
2024-11-18 16:16:15-P[33855]-T[33855]-[Extra]-PgExecSqlAsync     : OK, Elapsed Time    4.553 s, Affect    2098355 Rows. (DML,DDL,COPY)
2024-11-18 16:16:15-P[33855]-T[33855]-[Debug]-PgMetaDataPrint    :
RowNums    : 0
ColNums    : 0
AffectRows : 2098355
ParamNums  : 0
ParamType  : [ ]
2024-11-18 16:16:15-P[33855]-T[33855]-[Debug]-PgDestroy          : OK.

相关文章:

PostgreSql-学习06-libpq之同步命令处理

目录 一、环境 二、介绍 三、函数 1、PQsetdbLogin &#xff08;1&#xff09;作用 &#xff08;2&#xff09;声明 &#xff08;3&#xff09;参数介绍 &#xff08;4&#xff09;检测成功与否 2、PQfinish &#xff08;1&#xff09;作用 &#xff08;2&#xff0…...

简单配置,全面保护:HZERO审计服务让安全触手可及

HZERO技术平台&#xff0c;凭借多年企业资源管理实施经验&#xff0c;深入理解企业痛点&#xff0c;为您提供了一套高效易用的审计解决方案。这套方案旨在帮助您轻松应对企业开发中的审计挑战&#xff0c;确保业务流程的合规性和透明度。 接下来&#xff0c;我将为大家详细介绍…...

HCIA-Access V2.5_4_1_1路由协议基础_IP路由表

大型网络的拓扑结构一般会比较复杂&#xff0c;不同的部门&#xff0c;或者总部和分支可能处在不同的网络中&#xff0c;此时就需要使用路由器来连接不同的网络&#xff0c;实现网络之间的数据转发。 本章将介绍路由协议的基础知识、路由表的分类、静态路由基础与配置、VLAN间…...

Spring IOC 和 AOP的学习笔记

Spring框架是java开发行业的标准 Spring全家桶 Web&#xff1a;Spring Web MVC/Spring MVC、Spring Web Flux 持久层&#xff1a;Spring Data / Spring Data JPA 、Spring Data Redis 、Spring Data MongoDB 安全校验&#xff1a;Spring Security 构建工程脚手架&#xff…...

二七(vue2-03)、生命周期四个阶段及八个钩子、工程化开发和脚手架、组件注册、拆分组件

1. 生命周期 1.1 生命周期四个阶段 <!-- Vue生命周期&#xff1a;一个Vue实例从 创建 到 销毁 的整个过程。生命周期四个阶段&#xff1a;① 创建 ② 挂载 ③ 更新 ④ 销毁1.创建阶段&#xff1a;创建响应式数据2.挂载阶段&#xff1a;渲染模板3.更新阶段&#xff1a;修改…...

[树] 最轻的天平

问题描述 天平的两边有时不一定只能挂物品&#xff0c;还可以继续挂着另一个天平&#xff0c;现在给你一些天平的情况和他们之间的连接关系&#xff0c;要求使得所有天平都能平衡所需物品的总重量最轻。 一个天平平衡当且仅当“左端点的重量 \times 左端点到支点的距离 …...

Linux udev介绍使用

udev udev配置文件匹配键和赋值键操作符解释示例修改udev配置U盘自动挂载Usb卸载SD卡挂载SD卡卸载 udev配置文件 /etc/udev/udev.conf 这个文件通常很短&#xff0c;他可能只是包含几行#开头的注释&#xff0c;然后有几行选项&#xff1a; udev_root“/dev/” udev_rules“/…...

单片机:实现节日彩灯(附带源码)

本项目的目标是通过编程实现几个常见的彩灯效果&#xff0c;包括&#xff1a; 流水灯效果&#xff08;从左到右或从右到左&#xff09;闪烁效果&#xff08;所有灯同时闪烁&#xff09;渐变效果&#xff08;灯光从亮到灭&#xff0c;再从灭到亮&#xff09;定时切换颜色效果&a…...

流程引擎Activiti性能优化方案

流程引擎Activiti性能优化方案 Activiti工作流引擎架构概述 Activiti工作流引擎架构大致分为6层。从上到下依次为工作流引擎层、部署层、业务接口层、命令拦截层、命令层和行为层。 基于关系型数据库层面优化 MySQL建表语句优化 Activiti在MySQL中创建默认字符集为utf8&…...

【爬虫一】python爬虫基础合集一

【爬虫一】python爬虫基础合集一 1. 网络请求了解1.1. 请求的类型1.2. 网络请求协议1.3. 网络请求过程简单图解1.4. 网络请求Headers(其中的关键字释义)&#xff1a;请求头、响应头 2. 网络爬虫的基本工作节点2.1. 了解简单网络请求获取响应数据的过程所涉及要点 1. 网络请求了…...

any/all 子查询优化规则的原理与解析 | OceanBase查询优化

背景 在通常情况下&#xff0c;当遇到包含any/all子查询的语句时&#xff0c;往往需要遵循嵌套执行的方式&#xff0c;因此其查询效率较低。Oceanbase中制定了相应的any/all子查询优化规则&#xff0c;能够能够识别并优化符合条件的any/all子查询&#xff0c;从而有效提升查询…...

ECharts 饼图:数据可视化的重要工具

ECharts 饼图:数据可视化的重要工具 引言 在数据分析和可视化的领域,ECharts 是一个广受欢迎的开源库。它由百度团队开发,用于在网页中创建交互式图表。ECharts 提供了多种图表类型,包括柱状图、折线图、散点图等,而饼图则是其中最常用的一种。本文将深入探讨 ECharts 饼…...

第10章:CSS最佳实践 --[CSS零基础入门]

代码组织 在CSS开发中&#xff0c;良好的代码组织和最佳实践对于项目的可维护性和扩展性至关重要。以下是两个示例&#xff0c;展示了如何遵循CSS最佳实践来组织代码。 示例 1: 使用 BEM&#xff08;Block Element Modifier&#xff09;命名法 BEM 是一种用于提高 CSS 可读性…...

怎么在idea中创建springboot项目

最近想系统学习下springboot&#xff0c;尝试一下全栈路线 从零开始&#xff0c;下面将叙述下如何创建项目 环境 首先确保自己环境没问题 jdkMavenidea 创建springboot项目 1.打开idea&#xff0c;选择file->New->Project 2.选择Spring Initializr->设置JDK->…...

递归读取指定目录下的文件

序言 需要读取sftp服务器上符合指定的文件名正则的文件列表&#xff0c;目前想到的最好的办法就是递归。 我这里引入的依赖是&#xff1a; <!-- jsch-sftp连接 --><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artif…...

【模型压缩】原理及实例

在移动智能终端品类越发多样的时代&#xff0c;为了让模型可以顺利部署在算力和存储空间都受限的移动终端&#xff0c;对模型进行压缩尤为重要。模型压缩&#xff08;model compression&#xff09;可以降低神经网络参数量&#xff0c;减少延迟时间&#xff0c;从而实现提高神经…...

常用的JVM启动参数有哪些?

大家好&#xff0c;我是锋哥。今天分享关于【常用的JVM启动参数有哪些&#xff1f;】面试题。希望对大家有帮助&#xff1b; 常用的JVM启动参数有哪些&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM&#xff08;Java Virtual Machine&#xff09;启…...

Curvelet 变换与FDCT

Curvelet变换 Curvelet变换 是一种多尺度、多方向的信号分析工具,专门用于处理具有各向异性特征的信号,例如边缘和曲线。与传统的傅里叶变换和小波变换相比,Curvelet变换能够更精确地表示信号中的曲线特征,因此在图像处理、地震数据分析、医学成像等领域得到了广泛应用。 …...

Django Admin 管理工具

Django 提供了基于 web 的管理工具。 Django 自动管理工具是 django.contrib 的一部分。你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它&#xff1a; /HelloWorld/HelloWorld/settings.py 文件代码&#xff1a; INSTALLED_APPS ( django.contrib.admin, django.co…...

Android笔记【19】

具体示例 run: val result someObject.run {// 这里可以使用 thisthis.someMethod() }let: val result someObject?.let {// 这里使用 itit.someMethod() }with: val result with(someObject) {// 这里使用 thissomeMethod() }apply: val obj SomeClass().apply {// 这里使…...

Conda环境回滚实战:当安装新包搞崩base环境时如何一键恢复

Conda环境回滚实战&#xff1a;当安装新包搞崩base环境时如何一键恢复 在Python开发中&#xff0c;conda作为包管理和环境管理的利器&#xff0c;几乎成为数据科学家的标配工具。但越是频繁使用conda&#xff0c;越容易遇到一个令人头疼的问题——在base环境中安装新包后&#…...

Phi-4-mini-reasoning开发者调试手册:Chainlit后端日志定位、错误堆栈分析

Phi-4-mini-reasoning开发者调试手册&#xff1a;Chainlit后端日志定位、错误堆栈分析 1. 模型简介与部署验证 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据&#xff0c;并进一步微调以提高更高级的数学推理能力。…...

Flutter Documentation Website的布局系统:理解Flutter的约束模型

Flutter Documentation Website的布局系统&#xff1a;理解Flutter的约束模型 【免费下载链接】website Flutter documentation web site 项目地址: https://gitcode.com/gh_mirrors/websi/website Flutter Documentation Website的布局系统基于独特的约束模型&#xff…...

避坑指南:Informer模型更换自定义数据集时,90%新手会忽略的5个关键参数

Informer模型自定义数据集避坑指南&#xff1a;5个关键参数详解与实战调优 第一次尝试将Informer模型应用到自己的数据集上时&#xff0c;我盯着屏幕上那一串令人绝望的报错信息发呆了整整半小时。明明已经按照官方示例修改了数据路径和基本参数&#xff0c;为什么模型要么无法…...

Claude Code 源码泄露深度剖析,Anthropic AI 编程助手的架构全解密

2026年3月31日&#xff0c;整个AI开发圈被一条消息炸开了锅。安全研究员Chaofan Shou&#xff08;推特账号Fried_rice&#xff09;在Anthropic官方发布的npm包中&#xff0c;意外发现了一个暴露的.map文件&#xff0c;正是这个看似不起眼的文件&#xff0c;直接泄露了Claude Co…...

FreeSWITCH 1.10.10 图形化部署实战 - 麒麟V10 SP3 X86/ARM双架构服务器安装与配置指南

1. FreeSWITCH与麒麟V10 SP3的完美组合 FreeSWITCH作为一款开源的软交换平台&#xff0c;在企业通信、呼叫中心、即时通讯等领域有着广泛应用。而麒麟V10 SP3作为国产操作系统的代表&#xff0c;在信创领域扮演着重要角色。将这两者结合起来&#xff0c;既能满足国产化需求&am…...

PyTorch 2.8镜像真实效果:量子计算电路→量子态演化视频模拟

PyTorch 2.8镜像真实效果&#xff1a;量子计算电路→量子态演化视频模拟 1. 量子计算模拟效果展示 量子计算作为前沿计算领域&#xff0c;其可视化一直是教学和研究的难点。我们使用PyTorch 2.8镜像实现了从量子电路到量子态演化的完整视频模拟流程&#xff0c;以下是关键效果…...

如何高效使用猫抓插件:浏览器资源嗅探实用指南

如何高效使用猫抓插件&#xff1a;浏览器资源嗅探实用指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字化时代&#xff0c;我们每天浏览网…...

AI辅助开发:利用快马构建openclaw强化学习抓取训练环境

最近在研究机械爪的抓取策略优化&#xff0c;发现手动调参效率太低&#xff0c;于是尝试用AI辅助开发来构建一个强化学习训练环境。这个项目主要围绕openclaw机械爪的启动和控制策略展开&#xff0c;通过快马平台的AI能力快速搭建实验环境&#xff0c;效果出乎意料地好。 环境搭…...

MTK平台录音杂音怎么来的?从AudioALSACaptureDataClientAurisysNormal的mDropPopSize说起

MTK平台录音杂音问题深度解析&#xff1a;从硬件初始化到算法优化的全链路解决方案 在移动设备音频开发领域&#xff0c;MTK平台的录音杂音问题一直是困扰开发者的典型痛点。特别是录音起始阶段出现的"爆破音"或"电流声"&#xff0c;不仅影响用户体验&…...