第一步,初始化数据捕获环境。
SP_INIT_CPT_SYS(1) ;
第二步,创建要监控的表对象 T1。
CREATE TABLE T1(C1 INT,C2 BLOB, C3 CHAR(10),C4 SMALLINT,PRIMARY KEY(C1)); INSERT INTO T1 VALUES(1, 'A' , 'AB', 11); COMMIT;
第二步,在具体代码中调用 DPI 接口。通过调用数据捕获 DPI 接口,指定对具体对象、
具体列的监控。
下面编写一段代码,通过调用数据捕获 DPI 接口,来实现对表 T1 中,所有列的监控。
#include "DPIext.h" #include "DPI.h" #include "DPItypes.h" #include "dmcpt_dll.h" dhenv henv; /*环境句柄*/ dhcon hdbc; /*连接句柄*/ dhcon get_hdbc(dhcon hdbc,dhenv henv) { /*创建 DPI 运行环境*/ //dpi_init(); /*申请一个环境句柄*/ dpi_alloc_env(&henv); /*申请一个连接句柄*/ dpi_alloc_con(henv,&hdbc); /*设置连接端口*/ dpi_set_con_attr(hdbc, DSQL_ATTR_LOGIN_PORT, 5236, 0); /*连接到本地服务器*/ if (!DSQL_SUCCEEDED(dpi_login(hdbc,"192.168.0.38","SYSDBA","SYSDBA"))) { printf("connect failed!\n"); exit(-1); } return hdbc; } void free_hdbc(dhcon hdbc,dhenv henv) { /*断开与数据源之间的连接*/ dpi_logout(hdbc); /*释放连接句柄*/ dpi_free_con(hdbc); /*释放环境句柄*/ dpi_free_env(henv); } void test_cptview_case1() { cpt_col_def_t* col_def; cpt_col_def_t* temp; char cdc_id[130] = "NULL"; char cdc_blob_id[130]="NULL"; cpt_error_info_t ei; col_def=(cpt_col_def_t*)malloc(sizeof(cpt_col_def_t)*4); strcpy(col_def->name,"c1"); strcpy(col_def->col_define,""); strcpy(col_def->expr,""); temp = col_def + 1; strcpy(temp->name,"c2"); strcpy(temp->col_define,""); strcpy(temp->expr,""); temp = temp + 1; strcpy(temp->name,"c3"); strcpy(temp->col_define,""); strcpy(temp->expr,""); temp = temp + 1; strcpy(temp->name,"c4"); strcpy(temp->col_define,""); strcpy(temp->expr,""); hdbc=get_hdbc(hdbc, henv); dm_create_change_data_capture(hdbc,"SYSDBA","T1","",col_def,4,cdc_id,130,cdc_blob_id,130, &ei); printf("cdc_id:%s\n",cdc_id); printf("cdc_blob_id:%s\n",cdc_blob_id); printf("%s\n",ei.error_info); //可以在此改变表中的数据, //手动在客户端查询打印出的 cdc_id 和 cdc_blob_id 表名,监控开启捕获后,T1 表中数据的 变化。 //dm_drop_change_data_capture(hdbc,cdc_id, &ei);可以在此处关闭 DPI 接口。因为本例需要 后面查看查看捕获表,所以不关闭。 free_hdbc(hdbc, henv); } void main() { test_cptview_case1(); system("pause"); }
第三步,在数据捕获的窗口中,查看打印出的 cdc_id 和 cdc_blob_id。
cdc_id:CPT_SYSDBA_T1_82118833738749 cdc_blob_id:CPT_SYSDBA_T1_82118833738749_BLOB
第四步,对具体对象进行操作。通过 disql 等客户端来改变表中的数据。
insert into t1 values(2, 'B', 'BC', 22); insert into t1 values(3, 'C', 'CD', 33); insert into t1 values(4, 'D', 'DE', 44);
第五步,查看数据捕获表。通过 disql 等客户端来查看 cdc_id 和 cdc_blob_id 表中的数据。
cdc_id 表:
select * from CPT_SYSDBA_T1_82118833738749; --查询结果如下: 行号 OP_SEQ OPTYPE HAS_BLOB C1 C3 C4 OP_ERROR ---------- -------- ----------- -------- ----------- -------- ----------- -------- ----------- -------- 1 2 I Y 2 BC 22 NULL 2 3 I Y 3 CD 33 NULL 3 4 I Y 4 DE 44 NULL
cdc_blob_id 表:
select * from CPT_SYSDBA_T1_82118833738749_BLOB; --查询结果如下: 行号 OP_SEQ COL_NAME C1 ---------- -------------------- -------- ----------- ----------- -------- 1 2 C2 2 2 3 C2 3 3 4 C2 4
第 6 步,结束的时候,关闭数据捕获的环境。
SP_INIT_CPT_SYS(0);
https://xpanx.com/
评论