5. 程序开发示例

  • 连接数据库

  • 执行一条不返回结果的 SQL 语句

  • 执行一条查询语句并获取结果

  • 读写大字段数据

  • Oracle 动态方法 4

  • ANSI 动态方法 4

  • 执行 PL/SQL 块

  • 完整的编程示例

5.1. 连接数据库

Pro*C/C++ 中的连接有多种方式,用户可以根据所要编写的应用的实际场景选择合适的连接方式,并按需设定相应的连接参数。

在多连接方式下,能够指向性地选择所需要的连接是必要的功能。

void do_connect()
{print_title("Test for \"CONNECT\" clause");EXEC SQL BEGIN DECLARE SECTION;char auser[100] = "c##usr01";char apwd[100] = "usr01";char adbname[100] = "orcl";char auser_pwd[100] = "c##usr01/usr01@orcl";EXEC SQL END DECLARE SECTION;/* 默认连接 */EXEC SQL CONNECT :auser IDENTIFIED BY :apwd USING :adbname;if ( SQLCODE != 0){printf("CONNECT Datebase error.\n");exit(0);}/* 连接 1 */EXEC SQL DECLARE conn_1 DATABASE;EXEC SQL CONNECT :auser IDENTIFIED BY :apwd AT conn_1 USING :adbname;if ( SQLCODE != 0){printf("CONNECT Datebase error.\n");exit(0);}/* 连接 2 */EXEC SQL DECLARE conn_2 DATABASE;EXEC SQL CONNECT :auser_pwd AT conn_2;if ( SQLCODE != 0){printf("CONNECT Datebase error.\n");exit(0);}printf("CONNECT Datebase successfully.\n");
}

5.2. 执行一条不返回结果的 SQL 语句

以下是一个执行插入 SQL 语句的示例程序:

void do_insert_basedata()
{print_title("Prepare base data");EXEC SQL BEGIN DECLARE SECTION;int     ids[7] = {0};char    sNames[10][10] = {0};EXEC SQL END DECLARE SECTION;/* 准备基本数据数组 */ids[0] = 1;ids[1] = 2;ids[2] = 3;ids[3] = 9;ids[4] = 95;ids[5] = 2022;ids[6] = 43001;strcpy(sNames[0], "ababab");strcpy(sNames[1], "abcabc");strcpy(sNames[2], "3d3d3d3d");/* strcpy(sNames[3], ""); */strcpy(sNames[4], "xkhxx");strcpy(sNames[5], "dynamic");strcpy(sNames[6], "dynamic3");EXEC SQL INSERT INTO tab01 values(:ids, :sNames);EXEC SQL COMMIT;if ( SQLCODE == 0){printf("INSERT %d row data with array.\n", sqlca.sqlerrd[2]);}
}

5.3. 执行一条查询语句并获取结果

以下是一个执行查询 SQL 语句的示例程序:

void do_normal_select()
{print_title("Test for \"SELECT\" clause");EXEC SQL BEGIN DECLARE SECTION;int  iId = 0;char sName[50] = {0};varchar vName[50] = {0};int  *pId = NULL;char *pName = NULL;/* 指示符变量 */short ind_name;EXEC SQL END DECLARE SECTION;/* 选择Normal变量 */EXEC SQL SELECT name INTO :sName from tab01 where id=1;printf("Normal => name:[%s]\n", sName);/* 选择varchar变量 */EXEC SQL SELECT name INTO :vName from tab01 where id=1;printf("Normal => name:[%s]\n", vName.arr);/* 选择指针变量 */iId = 0;memset(sName, 0x00, sizeof(sName));pId = &iId;pName = "ababab";EXEC SQL SELECT id, name INTO :pId,:sName from tab01 where name=:pName;printf("Normal => id:[%d] name:[%s]\n", *pId, sName);/* 选择指示器变量 */iId = 0;memset(sName, 0x00, sizeof(sName));EXEC SQL SELECT id, name INTO :iId, :sName:ind_name from tab01 where id=9;if( ind_name==-1 ){printf("Normal indicator => id:[%d] name:[%s]\n", *pId, "(NULL)");}else{printf("Normal indicator => id:[%d] name:[%s]\n", *pId, sName);}/*****************************************************************//* 使用varchar变量进行选择 */iId = 0;memset(sName, 0x00, sizeof(sName));memset((void*)&vName, 0x00, sizeof(vName));strcpy(vName.arr, "ababab");vName.len = strlen((char*)vName.arr);EXEC SQL SELECT id, name INTO :pId,:sName from tab01 where name=:vName;printf("Normal => id:[%d] name:[%s]\n", *pId, sName);}

5.4. 读写大字段数据

以下为执行写入和读取 BLOB 数据的示例程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>#define BUFSIZE 128OCIBlobLocator *blob;
OCIClobLocator *clob1;
OCIClobLocator *clob2;
unsigned int amt, offset = 1, buflen, lobLen, chunkSize;
int isOpen, isTemporary;unsigned char buff[BUFSIZE];
unsigned char outBuff[BUFSIZE];EXEC SQL INCLUDE SQLCA;  /* 说明一个 SQL 通信区 */EXEC SQL WHENEVER SQLERROR CONTINUE;void do_lob_func()
{print_title("Test for \"LOB\"");int i;EXEC SQL DROP TABLE t_proc_lob;/* 开始测试 */EXEC SQL WHENEVER SQLERROR do print_sqlca();EXEC SQL CREATE TABLE t_proc_lob(b blob, c1 clob, c2 nclob);EXEC SQL INSERT INTO t_proc_lob VALUES(empty_blob(), empty_clob(), empty_clob());EXEC SQL ALLOCATE :blob ;EXEC SQL ALLOCATE :clob1 ;EXEC SQL ALLOCATE :clob2 ;EXEC SQL SELECT b, c1, c2 into :blob, :clob1, :clob2 FROM t_proc_lob FOR UPDATE;EXEC SQL VAR buff IS RAW(BUFSIZE);EXEC SQL VAR outBuff IS RAW(BUFSIZE);/* 执行lob数据写 */memset(buff, 'A', BUFSIZE);amt = 80;buflen = 80;EXEC SQL LOB WRITE ONE :amt FROM :buff WITH LENGTH :buflen INTO :blob AT :offset;/* 执行lob数据读 */memset(outBuff, 0, BUFSIZE);amt = BUFSIZE;EXEC SQL LOB READ :amt FROM :blob AT :offset INTO :outBuff;EXEC SQL LOB DESCRIBE :blob GET LENGTH, CHUNKSIZE INTO :lobLen, :chunkSize;EXEC SQL LOB DESCRIBE :blob GET LENGTH, ISOPEN, ISTEMPORARY,CHUNKSIZE INTO :lobLen, :isOpen, :isTemporary, :chunkSize;EXEC SQL LOB DESCRIBE :blob GET CHUNKSIZE, ISOPEN, ISTEMPORARY,LENGTH INTO :chunkSize, :isOpen, :isTemporary, :lobLen;for(i=0; i<BUFSIZE; i++){printf("%c", outBuff[i]);}printf("\n");printf("LENGTH:%u ISOPEN:%d ISTEMPORARY:%d CHUNKSIZE:%u\n", lobLen,isOpen, isTemporary, chunkSize);EXEC SQL FREE :blob ;
}

5.5. Oracle 动态方法 4

动态 SQL 方法四是动态 SQL 的主要使用方式,因为查询数据项的个数、输入主变量的占位符个数以及输入主变量的数据类型可能直到语句执行前才是可知的。 也因为如此,动态 SQL 方法 4 主要是通过描述符实现的,详细使用方法如下示例程序:

EXEC SQL WHENEVER SQLERROR GOTO end_select_loop;#define ID_SIZE      10
#define NAME_SIZE    10
#define INAME_SIZE   10
#define ARRAY_SIZE    5#define MAX_ITEMS    20int    array_size = ARRAY_SIZE;
char * sqlda_select_stmt="select id,name from tab01 where id>=:id";SQLDA   *select_dp;int  ids[ARRAY_SIZE];
int  id1, id2;
char names[ARRAY_SIZE][NAME_SIZE];short ind_ids[ARRAY_SIZE] = {0,0,0,0,0};
short ind_names[ARRAY_SIZE] = {0,0,0,0,0};void do_sqldyn_select()
{print_title("Test for \"SQLDA Dynamic SQL\" select");int i, null_ok, precision, scale;char bind_var[MAX_ITEMS][ID_SIZE] = {0};bind_dp = SQLSQLDAAlloc(SQL_SINGLE_RCTX, MAX_ITEMS, NAME_SIZE, INAME_SIZE);bind_dp->N = MAX_ITEMS;select_dp = SQLSQLDAAlloc(SQL_SINGLE_RCTX, MAX_ITEMS, NAME_SIZE, INAME_SIZE);select_dp->N = MAX_ITEMS;/* 分配指向索引变量和实际数据的指针 */for (i = 0; i < MAX_ITEMS; i++){bind_dp->I[i] = (short*)malloc(sizeof(short));select_dp->I[i] = (short*)malloc(sizeof(short));bind_dp->V[i] = (char*)malloc(1);select_dp->V[i] = (char*)malloc(1);}EXEC SQL PREPARE stmt FROM :sqlda_select_stmt;EXEC SQL DECLARE C CURSOR FOR stmt;strcpy(bind_var[0], "1014");EXEC SQL DESCRIBE BIND VARIABLES FOR stmt INTO bind_dp;if (bind_dp->F < 0){printf ("***Too many bind param[%d], max is [%d]\n", -bind_dp->F, MAX_ITEMS);return;}bind_dp->N = bind_dp->F;for (i = 0; i < bind_dp->F; i++){bind_dp->L[i] = strlen(bind_var[i]);bind_dp->V[i] = (char*)realloc(bind_dp->V[i], (bind_dp->L[i]+1));memcpy(bind_dp->V[i], bind_var[i], bind_dp->L[i]+1);*bind_dp->I[i] = 0;bind_dp->T[i] = 1;}/* 开启游标 */EXEC SQL OPEN C USING DESCRIPTOR bind_dp;select_dp->N = MAX_ITEMS;EXEC SQL DESCRIBE SELECT LIST FOR stmt INTO select_dp;if (select_dp->F < 0){printf ("***Too many select-items[%d], max is [%d]\n", -select_dp->F,MAX_ITEMS);return;}select_dp->N = select_dp->F;for (i = 0; i < select_dp->F; i++){char title[NAME_SIZE];SQLColumnNullCheck (SQL_SINGLE_RCTX, (unsigned short *)&(select_dp->T[i]),(unsigned short *)&(select_dp->T[i]), &null_ok);switch (select_dp->T[i]){case 1: /* CHAR datatype: no change in lengthneeded, except possibly for TO_CHARconversions (not handled here). */break;case 2: /* NUMBER datatype: use SQLNumberPrecV6() toextract precision and scale. */SQLNumberPrecV6(SQL_SINGLE_RCTX, (unsigned long*)&(select_dp->L[i]),&precision, &scale);/* 当Scale大于0时,将NUMBER数据类型转换成FLOAT,否则转换为INT类型 */select_dp->L[i] = (scale > 0) ? sizeof(float) : sizeof(int);break;}if (select_dp->T[i] != 2){select_dp->V[i] = (char*)realloc(select_dp->V[i], select_dp->L[i]+1);}else{select_dp->V[i] = (char*)realloc(select_dp->V[i], select_dp->L[i]);}/ 当名字以null终止时,复制到临时缓冲区 */memset(title, ' ', NAME_SIZE);strncpy(title, select_dp->S[i], select_dp->C[i]);if (select_dp->T[i] == 2)if (scale > 0)printf ("%.*s ", select_dp->L[i]+3, title);elseprintf ("%.*s ", select_dp->L[i], title);elseprintf("%-.*s ", select_dp->L[i], title);if (select_dp->T[i] == 2)if (scale > 0)select_dp->T[i] = 4;  /* float */elseselect_dp->T[i] = 3;  /* int */}printf ("\n");EXEC SQL WHENEVER NOT FOUND GOTO end_select_loop;for (;;){EXEC SQL FETCH C USING DESCRIPTOR select_dp;/* 由于返回的每个变量都被强制转换为字符串、int或float,这里几乎不需要进行任何处理。这个例行程序指示在终端上打印值。 */for (i = 0; i < select_dp->F; i++){if (*select_dp->I[i] < 0)if (select_dp->T[i] == 4)printf ("%-*c ",(int)select_dp->L[i]+3, ' ');elseprintf ("%-*c ",(int)select_dp->L[i], ' ');elseif (select_dp->T[i] == 3)     /* int datatype */printf ("%*d ", (int)select_dp->L[i],*(int *)select_dp->V[i]);else if (select_dp->T[i] == 4)     /* float datatype */printf ("%*.2f ", (int)select_dp->L[i],*(float *)select_dp->V[i]);else                          /* character string */printf ("%-*.*s ", (int)select_dp->L[i],(int)select_dp->L[i], select_dp->V[i]);}printf ("\n");}end_select_loop:if(SQLCODE!=0){print_sqlca();}/** 打印处理行数 **/printf("******%d rows selected.\n\n", sqlca.sqlerrd[2]);/** 完成后,释放分配给绑定和选择描述符指针的内存 **/for (i = 0; i < MAX_ITEMS; i++){if (bind_dp->V[i] != (char *) 0)free(bind_dp->V[i]);free(bind_dp->I[i]);   /* 分配MAX_ITEMS. */if (select_dp->V[i] != (char *) 0)free(select_dp->V[i]);free(select_dp->I[i]); /* 分配MAX_ITEMS. */}/* 释放描述符使用的空间. */SQLSQLDAFree( SQL_SINGLE_RCTX, bind_dp);SQLSQLDAFree( SQL_SINGLE_RCTX, select_dp);/*关闭游标 */EXEC SQL CLOSE C;
}

5.6. ANSI 动态方法 4

EXEC SQL WHENEVER SQLERROR do print_sqlca();
EXEC SQL WHENEVER NOT FOUND DO BREAK;char * mthd4_stmt3="select id,name from tab01 where id>=:id";void do_dynamic_method4_3()
{print_title("Test for \"Dynamic SQL\" method4 3");EXEC SQL BEGIN DECLARE SECTION;char sName[50];int  occurs = 0;int  out_cnt = 0;int  out_len = 0;int  out_type = 0;int  out_octet_len = 0;int  out_ret_len = 0;int  out_ret_octet_len = 0;int  out_precision = 0;int  out_scale = 0;char out_name[20] = {0};char out_char_set_name[20] = {0};short out_nullable;short out_ind = 0;short in_ind = 0;EXEC SQL END DECLARE SECTION;int i;int id_type=3, id_len=4, id_data=1;int id1_type=2, id1_data=0; /* SQLT_NUM  2 */int name_type=1;            /* SQLT_CHR  1 */char name_data[50];memset(name_data, 0x00, sizeof(name_data));/* 执行一个查询 */EXEC SQL ALLOCATE DESCRIPTOR 'input';EXEC SQL ALLOCATE DESCRIPTOR 'output';EXEC SQL PREPARE s FROM :mthd4_stmt3;EXEC SQL DESCRIBE INPUT s USING DESCRIPTOR 'input';EXEC SQL DESCRIBE OUTPUT s USING DESCRIPTOR 'output';/* 处理输入值 */EXEC SQL SET DESCRIPTOR 'input' VALUE 1 TYPE = :id_type,LENGTH = :id_len, DATA = :id_data;EXEC SQL DECLARE c CURSOR FOR s;EXEC SQL OPEN c USING DESCRIPTOR 'input';/* 处理输入值 */EXEC SQL SET DESCRIPTOR 'input' VALUE 1 TYPE = :id_type,LENGTH = :id_len, DATA = :id_data;EXEC SQL DECLARE c CURSOR FOR s;EXEC SQL OPEN c USING DESCRIPTOR 'input';/* 处理输出值 */EXEC SQL GET DESCRIPTOR 'output' :out_cnt = COUNT;for ( i=0; i<out_cnt; i++ ){occurs = i + 1;EXEC SQL GET DESCRIPTOR 'output' VALUE :occurs :out_type = TYPE,:out_len = LENGTH;EXEC SQL GET DESCRIPTOR 'output' VALUE :occurs :out_octet_len = OCTET_LENGTH,:out_ret_len = RETURNED_LENGTH;EXEC SQL GET DESCRIPTOR 'output' VALUE :occurs :out_ret_octet_len =RETURNED_OCTET_LENGTH,:out_precision = PRECISION;EXEC SQL GET DESCRIPTOR 'output' VALUE :occurs :out_name = NAME,:out_char_set_name =CHARACTER_SET_NAME;if ( out_type == id1_type ){EXEC SQL SET DESCRIPTOR 'output' VALUE :occurs TYPE = :out_type,LENGTH = :out_len, DATA = :id1_data, INDICATOR = :in_ind,CHARACTER_SET_NAME = :out_char_set_name;}else if ( out_type == name_type ){EXEC SQL SET DESCRIPTOR 'output' VALUE :occurs TYPE = :out_type,LENGTH = :out_len, DATA = :name_data;}else{printf("Dynamic method4 => unknow output field[%d]type:%d.\n", occurs, out_type);}}while(1){EXEC SQL FETCH c INTO DESCRIPTOR 'output';for ( i=0; i<out_cnt; i++ ){occurs = i + 1;EXEC SQL GET DESCRIPTOR 'output' VALUE :occurs :out_type = TYPE;if ( out_type == id1_type ){EXEC SQL GET DESCRIPTOR 'output' VALUE :occurs :id1_data = DATA,:out_ind = INDICATOR,:out_nullable = NULLABLE,:out_scale = SCALE;}else if ( out_type == name_type ){EXEC SQL GET DESCRIPTOR 'output' VALUE :occurs :name_data = DATA,:out_ind = INDICATOR,:out_nullable = NULLABLE,:out_scale = SCALE;}else{printf("Dynamic method4 => unknow output field[%d]type:%d.\n", occurs, out_type);}}printf("Dynamic method4 2 => id:[%d] name:[%s]\n", id1_data, name_data);}EXEC SQL CLOSE c;EXEC SQL DEALLOCATE DESCRIPTOR 'input';EXEC SQL DEALLOCATE DESCRIPTOR 'output';
}

5.7. 执行 PL/SQL 块

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sqlda.h>
#include <sqlcpr.h>EXEC SQL BEGIN DECLARE SECTION;int      acct;double   debit;double   new_bal;VARCHAR  status[20];
EXEC SQL END DECLARE SECTION;EXEC SQL INCLUDE SQLCA;void do_plsql()
{print_title("Embedded PL/SQL Debit Transaction Demo");EXEC SQL WHENEVER SQLERROR GOTO errprint;EXEC SQL DROP TABLE IF EXISTS accounts;EXEC SQL DROP TABLE IF EXISTS journal;EXEC SQL CREATE TABLE accounts(account_id number(4) not null, bal number(11,2));EXEC SQL CREATE TABLE journal(account_id number(4) not null,action varchar2(45) not null,amount number(11,2),date_tag date not null);EXEC SQL INSERT INTO accounts VALUES (1, 1000.00);acct = 1;debit = 100;/* ----- 开始PL/SQL块 ----- */EXEC SQL EXECUTEDECLAREtmp_bal             NUMBER(11,2);tmp_sta             VARCHAR(65);BEGINDECLAREinsufficient_funds  EXCEPTION;old_bal             NUMBER;min_bal             CONSTANT NUMBER := 500;BEGINSELECT bal INTO old_bal FROM accountsWHERE account_id = :acct;-- If the account doesn't exist, the NO_DATA_FOUND-- exception will be automatically raised.tmp_bal := old_bal - :debit;IF tmp_bal >= min_bal THENUPDATE accounts SET bal = tmp_balWHERE account_id = :acct;INSERT INTO journalVALUES (:acct, 'Debit', :debit, SYSDATE);tmp_sta := 'Transaction completed.';ELSERAISE insufficient_funds;END IF;COMMIT;EXCEPTIONWHEN NO_DATA_FOUND THENtmp_sta := 'Account not found.';tmp_bal := -1;WHEN insufficient_funds THENtmp_sta := 'Insufficient funds.';tmp_bal := old_bal;WHEN OTHERS THENROLLBACK;tmp_sta := 'Error: ' || SQLERRM(SQLCODE);tmp_bal := -1;END;BEGIN:status := tmp_sta;:new_bal := tmp_bal;END;END;END-EXEC;/* ----- 结束 PL/SQL 块 ----- *//* 以0终止字符串 */status.arr[status.len] = '\0';printf("===PL/SQL test ok.\n");printf("===Status:  %s\n", status.arr);if (new_bal >= 0)printf("===Balance is now:  $%.2f\n", new_bal);return;errprint:printf(">>> PL/SQL test failed.\n");printf(">>> Error during execution:\n");printf(">>> %s\n",sqlca.sqlerrm.sqlerrmc);EXEC SQL ROLLBACK RELEASE;
}

5.8. 完整的编程示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>EXEC SQL INCLUDE SQLCA;  /* 说明一个 SQL 通信区 */
EXEC SQL INCLUDE ORACA;  /* 说明一个 SQL 通信区 */EXEC SQL WHENEVER SQLERROR do print_sqlca();void print_sqlca();
int do_main_select();char * main_stmt="SELECT id,name FROM tab01 WHERE id>:id ";
char name_data[100];
long SQLCODE = 0;void print_sqlca()
{printf("=== SQLDA ===\n");printf("SQLCODE:[\e[31m%d\e[0m], SQLERR:[\e[31m%.*s\e[0m]\n",sqlca.sqlcode,sqlca.sqlerrm.sqlerrml,sqlca.sqlerrm.sqlerrmc);
}int main()
{EXEC SQL BEGIN DECLARE SECTION;char auser[20] = "system";char apwd[20] = "123456";char adbname[20] = "KingbaseES";int  ids[8] = {0};char sNames[10][10] = {0};int  iId = 0;char nName[20] = {0};EXEC SQL END DECLARE SECTION;EXEC ORACLE OPTION ( ORACA = YES ) ;/* 连接数据库 */EXEC SQL CONNECT :auser IDENTIFIED BY :apwd USING :adbname;if ( SQLCODE != 0){printf("CONNECT Datebase error.\n");exit(0);}/* 创建表 */EXEC SQL CREATE TABLE TAB01 (id number(38), name varchar2(15));ids[0] = 1;ids[1] = 2;ids[2] = 3;ids[3] = 9;ids[4] = 98;ids[5] = 99;ids[6] = 2022;ids[7] = 43001;strcpy(sNames[0], "ababab");strcpy(sNames[1], "abcabc");strcpy(sNames[2], "3d3d3d3d");strcpy(sNames[3], "");strcpy(sNames[4], "xkhxx");strcpy(sNames[5], "dynamic");strcpy(sNames[6], "dynamic");strcpy(sNames[7], "dynamic3");/* 数据插入 */EXEC SQL INSERT INTO tab01 values(:ids, :sNames);EXEC SQL COMMIT;if ( SQLCODE == 0){printf("INSERT %d row data with array.\n", sqlca.sqlerrd[2]);}/* 数据查询 */EXEC SQL SELECT name INTO :nName from tab01 where id=1;/* 数据更新 */EXEC SQL UPDATE tab01 SET name='Update1' WHERE id=98;memset(nName, 0x00, sizeof(nName));memcpy(nName, "Update2", sizeof("Update2"));EXEC SQL UPDATE tab01 SET name=:sName WHERE id=99;/* 数据删除 */EXEC SQL DELETE FROM tab01 WHERE id=98;EXEC SQL COMMIT;iId = 99;EXEC SQL DELETE FROM tab01 WHERE id=:iId;EXEC SQL COMMIT;/* 清空表 */EXEC SQL TRUNCATE TABLE TAB01;/* 删除表 */EXEC SQL DROP TABLE TAB01;return 0;
}

金仓数据库 Pro*C 迁移指南( 5. 程序开发示例)相关推荐

  1. 金仓数据库字段_mysql迁移到金仓数据库(V8R3)

    mysql迁移到金仓数据库(V8R3)方案 ​ 本次迁移为停机停服迁移,无需保障服务不中断,不存在在线数据实时迁移问题.为了实现mysql数据库迁移到金仓数据库,我们需要从以下几方面考虑解决方案 金仓 ...

  2. 人大金仓删除字段_人大金仓数据库(kingbase7d)操作入门指南 Windows

    1.1.12 安装成功,在开始菜单中可以看到以下数据库操作工具: 1.2 数据库卸载 1.2.1 选择 卸载 : 1.2.2 点击 卸载 : 1.2.3 选择 确定 ,开始数据库的卸载 : 1.2.4 ...

  3. 金仓数据库 KDTS 迁移工具使用指南(3. 系统部署)

    3. 系统部署 3.1. 准备工作 迁移程序从源数据库读取数据后写入目标数据库,因此需要一定量的内存作为中转缓存(并行度越高.表中单行数据越大(特别是大对象(LOB,Large Object)字段,如 ...

  4. 金仓数据库KingbaseES数据迁移

    关键字:kingbase,数据迁移,DTS 数据迁移是在不同存储类型.格式和计算机系统之间的数据转换,数据迁移需要使用相应的工具来进行,kingbaseES中为此提供了DTS数据迁移工具. DTS是一 ...

  5. 麒麟操作系统安装金仓数据库V7(kingbase7)

    原文地址 麒麟操作系统下安装金仓数据库,转载大佬的文章,安装步骤是一个道理. 以为金仓数据库要求是非root用户安装,在安装的时候会碰到碰到文件写入权限的问题,以麒麟为例,安装的时候的目录是在/opt ...

  6. 人大金仓(Kingbase)数据库迁移——KDMS工具(人大金仓数据库迁移工具迁移失败可使用此方法)

    使用KDMS工具迁移 注意事项: 使KDMS工具迁移数据库时只能迁移除数据库表数据之外的内容之后再结合金仓数据库本身的工具进行迁移数据 相关推荐:金仓工具进行迁移数据  https://blog.cs ...

  7. 国产化适配之人大金仓数据库(二)数据迁移

    本文介绍金仓数据库windows客户端自带的可视化界面数据迁移工具来迁移mysql的数据到金仓数据库. KingbaseDTS 数据库迁移工具 迁移前准备 因为不能使用默认的system用户,所以需要 ...

  8. mysql数据库迁移到人大金仓数据库问题记录清单

    (1)数据库类型不支持异常:dbType not support : null, url jdbc:kingbase8. 解决方法: 数据源配置: spring:datasource:druid:st ...

  9. 墨天轮国产数据库沙龙 | 黄新著:金仓数据库全生命周期管控

    在共同推进国产化生态发展的进程下,墨天轮正式推出"墨天轮国产数据库沙龙"系列直播活动,将定期邀请各国产数据库产品专家.掌门人,共同探讨如何达成技术"自主可控"的 ...

最新文章

  1. 5.C#-if-else分支语句结构
  2. Java8 Lambda不仅仅只是语法糖
  3. django定义模型类-14
  4. 再述autowiring
  5. LDD3中snull网络驱动程序的使用
  6. Navicat 连接Mysql 报错1251
  7. 【华为云技术分享】HBase与AI/用户画像/推荐系统的结合:CloudTable标签索引特性介绍
  8. MySQL中有exists关键字吗_Mysql中EXISTS关键字用法、总结
  9. java判断两线段是否相交
  10. android中getSystemService详解
  11. 利用Tukey方法识别离群值
  12. python display方法_python学习之Display
  13. 每日分享,一个不错的数据分析实战案例【数据分析可视化】MySQL+Python
  14. 闰年的计算方法及程序算法的实现
  15. 网络安全实验室|网络信息安全攻防学习平台(基础关)
  16. c#生成PPT总结(Microsoft.Office.Interop)
  17. oracle 12.2R2 安装GI跑root.sh遇到CLSRSC-400
  18. 面试官:请讲一讲IO流核心模块与基本原理是什么?
  19. 什么是相对论?相对论是什么?用人话讲讲相对论
  20. 查找网络上的计算机快捷键,快捷键查找是ctrl加多少

热门文章

  1. stm32霍尔编码器测速(标准库函数版)
  2. openJDK 官方二进制下载
  3. pandas-hw4
  4. 壹佰大咖说丨想做互联网金融平台产品经理,你懂风控、通道吗?
  5. 电商五十七、商家申请入驻-------------------------代码实现
  6. 解决JSON解析报错JsonParseException_ Unrecognized token ‘zxx‘_ was expecting (‘true‘, ‘false‘ or ‘null‘)
  7. 全套源码丨超实用的双人联机对战游戏开发分享,拒绝踩坑!
  8. 中心和非中心卡方分布
  9. 《淘宝首页性能优化实践》文章阅读
  10. 程序员常访问的几个网站