华为云用户手册

  • IGNORE MySQL UPDATE语句如果使用IGNORE修饰符,即使更新期间发生错误,UPDATE语句也不会中止。 输入示例 1 2 #测试 IGNORE 语法点 UPDATE IGNORE employees SET department_id=3; 输出示例 1 2 --测试 IGNORE 语法点 UPDATE "public"."employees" SET "department_id" = 3; 父主题: UPDATE
  • 类型对照 输入示例JSON 1 2 3 4 5 6 7 CREATE TABLE IF NOT EXISTS `runoob_dataType_test`( `dataType_1` INT, `dataType_2` VARCHAR, `dataType_3` JSON ); ALTER TABLE `runoob_dataType_test` ADD COLUMN `dataType_4` JSON NOT NULL; ALTER TABLE `runoob_dataType_test` CHANGE COLUMN `dataType_4` `dataType_5` JSON NOT NULL; 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CREATE TABLE IF NOT EXISTS "public"."runoob_datatype_test" ( "datatype_1" INTEGER, "datatype_2" VARCHAR, "datatype_3" JSONB ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("datatype_1"); ALTER TABLE "public"."runoob_datatype_test" ADD COLUMN "datatype_4" JSONB; ALTER TABLE "public"."runoob_datatype_test" CHANGE COLUMN "datatype_4" "datatype_5" JSONB;
  • UNION UNION 是 MERGE 引擎的建表参数。通过该关键字建表类似于创建普通视图。新创建的表将在逻辑上合并UNION关键字限定的多个表的数据。DSC迁移时会将该特性转为 GaussDB 视图创建语句。 输入示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20) ) ENGINE=MyISAM; CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20) ) ENGINE=MyISAM; CREATE TABLE total ( a INT NOT NULL AUTO_INCREMENT, message CHAR(20)) ENGINE=MyISAM UNION=(t1,t2) INSERT_METHOD=LAST; 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 CREATE TABLE "public"."t1" ( "a" SERIAL NOT NULL PRIMARY KEY, "message" CHAR(80) ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("a"); CREATE TABLE "public"."t2" ( a SERIAL NOT NULL PRIMARY KEY, message CHAR(80) ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("a"); CREATE VIEW "public"."total"(a, message) AS SELECT * FROM "public"."t1" UNION ALL SELECT * FROM "public"."t2"; 父主题: 表(可选参数、操作)
  • REF CURSOR REF Cursor是一种数据类型,它可保存数据库游标值,并可用于返回查询结果。 DSC支持REF CURSOR的迁移。如下示例显示了DSC如何迁移lref_strong_emptyp(本地REF CURSOR)和ref_strong_emptyp(包级别REF CURSOR)。 输入:PL/SQL程序包中使用REF CURSOR(包规范和包体) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 # Package specification CREATE OR REPLACE PACKAGE pkg_refcur IS TYPE ref_variable IS REF CURSOR; TYPE ref_strong_emptyp IS REF CURSOR RETURN emp_o%ROWTYPE; PROCEDURE p_get_employees ( v_id in INTEGER ,po_results OUT ref_strong_emptyp ); END pkg_refcur ; / # Package body CREATE OR REPLACE PACKAGE BODY pkg_refcur IS TYPE lref_strong_emptyp IS REF CURSOR RETURN emp_o%ROWTYPE ; var_num NUMBER ; PROCEDURE p_get_employees ( v_id IN INTEGER, po_results OUT ref_strong_emptyp ) is vemp_rc lref_strong_emptyp ; Begin OPEN po_results for SELECT * FROM emp_o e WHERE e.id = v_id; EXCEPTION WHEN OTHERS THEN RAISE; END p_get_employees; END pkg_refcur; / 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 BEGIN INSERT INTO MIG_ORA_EXT.MIG_PKG_VARIABLES ( SCHEMA_NAME ,PACKAGE_NAME ,SPEC_OR_BODY ,VARIABLE_NAME ,VARIABLE_TYPE ,CONSTANT_I ,DEFAULT_VALUE ,EXPRESSION_I ) VALUES ( UPPER( current_schema ( ) ) ,UPPER( 'pkg_refcur' ) ,'B' ,UPPER( 'var_num' ) ,UPPER( 'NUMBER' ) ,false ,NULL ,false ) ; END ; / CREATE OR REPLACE PROCEDURE pkg_refcur#p_get_employees ( v_id IN INTEGER ,po_results OUT SYS_REFCURSOR ) is vemp_rc SYS_REFCURSOR ; Begin OPEN po_results for SELECT * FROM emp_o e WHERE e.id = v_id ; EXCEPTION WHEN OTHERS THEN RAISE ; END ; / 父主题: PL/SQL包
  • DISTRIBUTE BY 在ADB中支持分布键,DSC迁移过程中会保留对应分布键。 输入示例 1 2 3 4 5 6 7 CREATE TABLE COPY_DI_DISTRIBUTOR_BUYER_CONTRIBUTION_RANKING_V2 ( SHOP_ID VARCHAR , DISTRIBUTOR_ID VARCHAR , BUYER_ID VARCHAR , DATE_TYPE BIGINT , PRIMARY KEY (SHOP_ID,DISTRIBUTOR_ID,DATE_TYPE,BUYER_ID) ) DISTRIBUTE BY HASH(SHOP_ID,DISTRIBUTOR_ID,DATE_TYPE); 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE "public"."copy_di_distributor_buyer_contribution_ranking_v2" ( "shop_id" VARCHAR, "distributor_id" VARCHAR, "buyer_id" VARCHAR, "date_type" BIGINT, PRIMARY KEY ( "shop_id", "distributor_id", "date_type", "buyer_id" ) ) WITH (ORIENTATION = ROW, COMPRESSION = NO) NOCOMPRESS DISTRIBUTE BY HASH (SHOP_ID, DISTRIBUTOR_ID, DATE_TYPE); 父主题: 表(可选参数、操作)
  • 行列存压缩 GaussDB(DWS)中, 只支持列存表压缩功能,暂不支持行存表压缩功能。优化行列存压缩机制,DSC工具迁移时会根据GaussDB(DWS)的特性进行相应适配。 压缩参数 : table.compress.mode创建新表时,需要在CREATE TABLE语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。 table.compress.row和table.compress.column指定表数据的压缩级别,它决定了表数据的压缩比以及压缩时间。一般来讲,压缩级别越高,压缩比也越大,压缩时间也越长;反之亦然。实际压缩比取决于加载的表数据的分布特征。 table.compress.level指定表数据同一压缩级别下的不同压缩水平,它决定了同一压缩级别下表数据的压缩比以及压缩时间。对同一压缩级别进行了更加详细的划分,为用户选择压缩比和压缩时间提供了更多的空间。总体来讲,此值越大,表示同一压缩级别下压缩比越大,压缩时间越长;反之亦然。 行存表输入示例 1 2 3 4 5 6 7 DROP TABLE IF EXISTS `public`.`runoob_tbl`; CREATE TABLE IF NOT EXISTS `public`.`runoob_tbl`( `runoob_id` VARCHAR, `runoob_title` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40) NOT NULL, `submission_date` VARCHAR )ENGINE=InnoDB DEFAULT CHARSET=utf8; 行存表输出示例 1 2 3 4 5 6 7 DROP TABLE IF EXISTS "public"."runoob_tbl"; CREATE TABLE IF NOT EXISTS "public"."runoob_tbl" ( "runoob_id" VARCHAR, "runoob_title" VARCHAR(400) NOT NULL, "runoob_author" VARCHAR(160) NOT NULL, "submission_date" VARCHAR ) WITH (ORIENTATION = ROW, COMPRESSION = YES) COMPRESS DISTRIBUTE BY HASH ("runoob_id"); 列存表输入示例 1 2 3 4 5 6 7 DROP TABLE IF EXISTS `public`.`runoob_tbl`; CREATE TABLE IF NOT EXISTS `public`.`runoob_tbl`( `runoob_id` VARCHAR, `runoob_title` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40) NOT NULL, `submission_date` VARCHAR )ENGINE=InnoDB DEFAULT CHARSET=utf8; 列存表输出示例 1 2 3 4 5 6 7 8 9 10 11 DROP TABLE IF EXISTS "public"."runoob_tbl"; CREATE TABLE IF NOT EXISTS "public"."runoob_tbl" ( "runoob_id" VARCHAR, "runoob_title" VARCHAR(400) NOT NULL, "runoob_author" VARCHAR(160) NOT NULL, "submission_date" VARCHAR ) WITH ( COMPRESSLEVEL = 1, ORIENTATION = COLUMN, COMPRESSION = LOW ) DISTRIBUTE BY HASH ("runoob_id"); 父主题: 表(可选参数、操作)
  • 高斯关键字:SOURCE指定为无AS关键字的列别名 Netezza语法 迁移后语法 1 2 3 4 SELECT SUBSTR( OP_SOURCE ,1 ,4 ) SOURCE , ONLINE_FLAG, 'TRD' AS SRC_SYS , CURRENT_TIMESTAMP AS ETL_LOAD_TIME FROM tb_keyword_source; 1 2 3 4 SELECT SUBSTR( OP_SOURCE ,1 ,4 ) AS SOURCE , ONLINE_FLAG, 'TRD' AS SRC_SYS , CURRENT_TIMESTAMP AS ETL_LOAD_TIME FROM tb_keyword_source;
  • ATTRIBUTE (应指定AS) Netezza语法 迁移后语法 1 2 3 4 5 SELECT t1.etl_date, substr(t1.attribute,1,1) attribute , t1.cust_no, t1.branch_code FROM ( SELECT etl_date,attribute,cust_no,branch_code FROM tb_ntz_keyword_attribute WHERE etl_date = CURRENT_DATE ) t1; 1 2 3 4 5 SELECT t1.etl_date, substr(t1.attribute,1,1) AS attribute , t1.cust_no, t1.branch_code FROM ( SELECT etl_date,attribute,cust_no,branch_code FROM tb_ntz_keyword_attribute WHERE etl_date = CURRENT_DATE ) t1;
  • SET MySQL REPLACE支持使用SET设置值,DSC工具将对其转换。 输入 1 2 3 4 5 replace INTO `runoob_datatype_test` VALUES (100, 100, 100, 0, 1); replace INTO `runoob_datatype_test` VALUES (100.23, 100.25, 100.26, 0.12,1.5); replace INTO `runoob_datatype_test` (dataType_numeric,dataType_numeric1) VALUES (100.23, 100.25); replace INTO `runoob_datatype_test` (dataType_numeric,dataType_numeric1,dataType_numeric2) VALUES (100.23, 100.25, 2.34); replace into runoob_datatype_test set dataType_numeric=23.1, dataType_numeric4 = 25.12 ; 输出 1 2 3 4 5 INSERT INTO "public"."runoob_datatype_test" VALUES (100,100,100,0,1); INSERT INTO "public"."runoob_datatype_test" VALUES (100.23,100.25,100.26,0.12,1.5); INSERT INTO "public"."runoob_datatype_test" ("datatype_numeric","datatype_numeric1") VALUES (100.23,100.25); INSERT INTO "public"."runoob_datatype_test" ("datatype_numeric","datatype_numeric1","datatype_numeric2") VALUES (100.23,100.25,2.34); INSERT INTO "public"."runoob_datatype_test" ("datatype_numeric","datatype_numeric4") VALUES (23.1,25.12); 父主题: REPLACE
  • 表操作符 可以在查询的FROM子句中调用函数,该函数包含在表操作符内部。 输入:表操作符,使用RETURNS 1 2 SELECT * FROM TABLE( sales_retrieve (9005) RETURNS ( store INTEGER, item CLOB, quantity BYTEINT) ) AS ret; 输出: 1 2 SELECT * FROM sales_retrieve(9005) AS ret (store, item, quantity); 父主题: 函数和操作符
  • DBC.COLUMNS DBC.COLUMNS视图是一个表,包含有关表和视图列、存储过程、或宏参数的信息。其中包括以下列:DatabaseName、TableName、ColumnName、ColumnFormat、ColumnTitle、ColumnType、DefaultValue。在GaussDB(DWS)中,这个表等效于information_schema.columns表。 本特性要求一次性执行以下自定义脚本文件:DSC/scripts/teradata/db_scripts/mig_fn_get_datatype_short_name.sql 有关文件执行的详细步骤,请参见运行环境和前提条件。 迁移工具将以下dbc.columns列迁移为对应的information_schema列: 表1 dbc.columns列迁移到information_schema列 dbc.columns information_schema.columns ColumnName Column_Name ColumnType mig_fn_get_datatype_short_name (data_Type) ColumnLength character_maximum_length DecimalTotalDigits numeric_precision DecimalFractionalDigits numeric_scale databasename table_schema tablename table_name ColumnId ordinal_position 迁移dbc.columns时,假设以下条件成立: FROM子句仅包含dbc.columns的TABLE NAME。 COLUMN NAME为以下任一格式:column_name或schema_name.table_name.column_name。 以下场景不支持dbc.columns迁移: FROM子句包含dbc.columns表名的别名(dbc.columns别名)。 dbc.columns与其他表组合(FROM dbc.columns alias1,table1 alias2 OR dbc.columns alias1 join table1 alias2)。 如果输入的SELECT语句直接包含dbc.columns的列名,则该工具会将输入的列名称迁移为别名。例如,输入列名称DecimalFractionalDigits会迁移为numeric_scale,其别名为DecimalFractionalDigits。 示例: 输入: 1 2 3 4 5 6 SEL columnid ,DecimalFractionalDigits FROM dbc.columns ; 输出: 1 2 3 4 5 6 SELECT ordinal_position columnid ,numeric_scale DecimalFractionalDigits FROM information_schema.columns ; 关于表名和模式名称,迁移工具会将所有字符串值转换为小写。如果要区分大小写,使用双引号表示表/模式名称。在以下输入示例中,“Test”不会转换为小写。 1 2 3 4 5 6 SELECT TableName FROM dbc . columns WHERE dbc.columns.databasename = '"Test"'; 输入:dbc.columns table,指定所有支持列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 SELECT '$AUTO_DB_IP' ,objectdatabasename ,objecttablename ,'$TX_DATE_10' ,'' ,'0' ,FirstStepTime ,FirstRespTime ,RowCount ,cast(RowCount*sum(case when T2.ColumnType ='CV' then T2.ColumnLength/3 else T2.ColumnLength end) as decimal(38,0)) ,'3' ,'' ,'BAK_CLR_DATA' ,'2' ,'' FROM TMP_clr_information T1 inner join dbc.columns T2 on T1.objectdatabasename =T2.DatabaseName and T1.objecttablename =T2.TableName where T2.DatabaseName not in ( sel child from dbc.children where parent='$FCRM_DB' ) group by 1,2,3,4,5,6,7,8,9,11,12,13,14,15; 输出: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 SELECT '$AUTO_DB_IP' ,objectdatabasename ,objecttablename ,'$TX_DATE_10' ,'' ,'0' ,FirstStepTime ,FirstRespTime ,RowCount ,CAST( RowCount * SUM ( CASE WHEN mig_fn_get_datatype_short_name ( T2.data_Type ) = 'CV' THEN T2.character_maximum_length / 3 ELSE T2.character_maximum_length END ) AS DECIMAL( 38 ,0 ) ) ,'3' ,'' ,'BAK_CLR_DATA' ,'2' ,'' FROM TMP_clr_information T1 INNER JOIN information_schema.columns T2 ON T1.objectdatabasename = T2.table_schema AND T1.objecttablename = T2.table_name WHERE NOT EXISTS ( SELECT child FROM dbc.children WHERE child = T2.table_schema AND( parent = '$FCRM_DB' ) ) GROUP BY 1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,11 ,12 ,13 ,14 ,15 ; 输入:dbc.columns table,指定表名 1 2 3 4 5 6 7 8 9 10 SELECT TRIM( ColumnName ) ,UPPER( dbc.columns.ColumnType ) FROM dbc . columns WHERE dbc.columns.databasename = '"Test"' ORDER BY dbc.columns.ColumnId ; 输出: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 SELECT TRIM( Column_Name ) ,UPPER( mig_fn_get_datatype_short_name ( information_schema.columns.data_Type ) ) FROM information_schema.columns WHERE information_schema.columns.table_schema = CASE WHEN TRIM( '"Test"' ) LIKE '"%' THEN REPLACE( SUBSTR( '"Test"' ,2 ,LENGTH( '"Test"' ) - 2 ) ,'""' ,'"' ) ELSE LOWER( '"Test"' ) END ORDER BY information_schema.columns.ordinal_position ; 父主题: 模式对象与数据定义(DDL)
  • 任务示例 示例:将Teradata数据库的SQL文件迁移到适用于Linux系统下的GaussDB(DWS) 的SQL脚本中。 1 ./runDSC.sh --source-db Teradata --input-folder D:\test\conversion\input --output-folder D:\test\conversion\output --log-folder D:\test\conversion\log --conversion-type ddl --targetdb gaussdb 示例:执行以下命令,将Teradata数据库的SQL文件迁移到适用于Windows操作系统下的GaussDB(DWS)的SQL脚本中。 1 runDSC.bat --source-db Teradata --input-folder D:\test\conversion\input --output-folder D:\test\conversion\output --log-folder D:\test\conversion\log --conversion-type ddl --targetdb gaussdb 控制台上显示迁移详情(包括进度和完成状态): ********************** Schema Conversion Started ************************* DSC process start time : Mon Jan 20 17:24:49 IST 2020 Statement count progress 100% completed [FILE(1/1)] Schema Conversion Progress 100% completed ************************************************************************** Total number of files in input folder : 1 Total number of valid files in input folder : 1 ************************************************************************** Log file path :....../DSC/DSC/log/dsc.log Error Log file : DSC process end time : Mon Jan 20 17:24:49 IST 2020 DSC total process time : 0 seconds ********************* Schema Conversion Completed ************************
  • dbc.sessioninfo 输入: SELECT username ,clientsystemuserid ,clientipaddress ,clientprogramname FROM dbc.sessioninfo WHERE sessionno = lv_mig_session ; 输出: select usename AS username, NULL::TEXT AS clientsystemuserid , client_addr AS clientipaddress, application_name AS clientprogramname from pg_catalog.pg_stat_activity WHERE pid = lv_mig_session;
  • dbc.sessioninfoV 输入: select username,clientsystemuserid,clientipaddress,clientprogramname from dbc.sessioninfoV where sessionno = 140167641814784; 输出: select usename AS username, NULL::TEXT AS clientsystemuserid , client_addr AS clientipaddress, application_name AS clientprogramname from pg_catalog.pg_stat_activity WHERE pid = 140167641814784;
  • 示例 该示例是从GaussDB(DWS)数据源中读取数据,并写入到Print结果表中,其具体步骤参考如下: 在GaussDB(DWS)中创建相应的表,表名为dws_order,SQL语句参考如下: 1 2 3 4 5 6 7 8 9 10 create table public.dws_order( order_id VARCHAR, order_channel VARCHAR, order_time VARCHAR, pay_amount FLOAT8, real_pay FLOAT8, pay_time VARCHAR, user_id VARCHAR, user_name VARCHAR, area_id VARCHAR); 在GaussDB(DWS)中执行以下SQL语句,向dws_order表中插入数据: 1 2 3 4 5 6 7 8 9 10 11 12 insert into public.dws_order (order_id, order_channel, order_time, pay_amount, real_pay, pay_time, user_id, user_name, area_id) values ('202103241000000001', 'webShop', '2021-03-24 10:00:00', '100.00', '100.00', '2021-03-24 10:02:03', '0001', 'Alice', '330106'), ('202103251202020001', 'miniAppShop', '2021-03-25 12:02:02', '60.00', '60.00', '2021-03-25 12:03:00', '0002', 'Bob', '330110'); 执行Flink SQL: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 CREATE TABLE dwsSource ( order_id string, order_channel string, order_time string, pay_amount double, real_pay double, pay_time string, user_id string, user_name string, area_id string ) WITH ( 'connector' = 'dws', 'url' = 'jdbc:gaussdb://DWSIP:DWSPort/DWSdbName', 'tableName' = 'dws_order', 'username' = 'DWSUserName', 'password' = 'DWSPassword' ); CREATE TABLE printSink ( order_id string, order_channel string, order_time string, pay_amount double, real_pay double, pay_time string, user_id string, user_name string, area_id string ) WITH ( 'connector' = 'print' ); insert into printSink select * from dwsSource; 执行结果如下:
  • 语法格式 用DWS-Connector做源表时,DWS-Connector实现了SupportsLimitPushDown和SupportsFilterPushDown接口,支持将limit和where条件下推到数据库执行。 1 2 3 4 5 6 7 8 9 10 11 12 13 create table dwsSource ( attr_name attr_type (',' attr_name attr_type)* (','PRIMARY KEY (attr_name, ...) NOT ENFORCED) (',' watermark for rowtime_column_name as watermark-strategy_expression) ) with ( 'connector' = 'dws', 'url' = '', 'tableName' = '', 'username' = '', 'password' = '' );
  • 参数说明 表1 数据库配置 参数 说明 默认值 connector flink框架区分connector参数,固定为dws。 - url 数据库连接地址。 - username 配置连接用户。 - password 配置密码。 - tableName 对应dws表。 - 表2 查询参数 参数 说明 默认值 fetchSize jdbc statement中fetchSize参数,用于控制查询数据库返回条数。 1000 enablePushDown 开启条件下推:开启后limit和where条件会下推到数据库执行。 true
  • gds.conf参数说明 表1 gds.conf配置说明 属性 说明 取值范围 name 标识名。 - ip 监听ip地址。 IP需为合法IP地址。 IP的默认值:127.0.0.1 port 监听端口号。 取值范围:1024~65535,正整数。 默认值:8098。 data_dir 数据文件目录。 - err_dir 错误日志文件目录。 默认值:数据文件目录 log_file 日志文件路径。 - host 设置允许连接到GDS的主机IP地址(参数为CIDR格式,仅支持linux系统)。 - recursive 是否递归数据文件目录。 取值范围: true:递归 。 false:不递归。 默认值:false。 daemon 是否以DAEMON(后台)模式运行。 取值范围: true:以DAEMON模式运行。 false:不以DAEMON模式运行。 默认值:false。 parallel 导入工作线程并发数目。 取值范围:0~200,正整数。 默认值:8。
  • 背景信息 GDS的版本需与集群版本保持一致(如:GDS V100R008C00版本与DWS 1.3.X版本配套),否则可能会出现导入导出失败或导入导出进程停止响应等情况。因此请勿使用历史版本的GDS进行导入。 数据库版本升级后,请按照操作步骤中的办法下载GaussDB(DWS)软件包解压缩自带的GDS进行安装配置和启动。在导入导出开始时,GaussDB(DWS)也会进行两端的版本一致性检测,不一致时会在屏幕上显示报错信息并终止对应操作。 GDS的版本号的查看办法为:在GDS工具的解压目录下执行如下命令。 gds -V 数据库版本的查看办法为:连接数据库后,执行如下SQL命令查看。 1 SELECT version();
  • 类型对照 表1 大对象类型对照表 MySQL大对象类型 MySQL INPUT GaussDB(DWS) OUTPUT TINYBLOB TINYBLOB BLOB BLOB BLOB BLOB MEDIUMBLOB MEDIUMBLOB BLOB LONGBLOB LONGBLOB BLOB 输入示例[TINY|MEDIUM|LONG]BLOB 1 2 3 4 5 6 7 CREATE TABLE IF NOT EXISTS `runoob_dataType_test`( `dataType_1` BIGINT, `dataType_2` TINYBLOB, `dataType_3` BLOB, `dataType_4` MEDIUMBLOB, `dataType_5` LONGBLOB ); 输出示例 1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE IF NOT EXISTS "public"."runoob_datatype_test" ( "datatype_1" BIGINT, "datatype_2" BLOB, "datatype_3" BLOB, "datatype_4" BLOB, "datatype_5" BLOB ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("datatype_1");
  • CURRVAL 要迁移CURRVAL,用户可使用自定义函数,获取序列当前值。在DSC安装过程中,需在要执行迁移的所有数据库中创建该函数。 CURRVAL是Oracle系统函数,GaussDB(DWS)不隐式支持该函数。为了支持该函数,DSC会在PUBLIC模式中创建一个CURRVAL函数。迁移后的语句会使用该PUBLIC.CURRVAL函数。 将参数MigSupportSequence设为true,可将CURRVAL迁移为PUBLIC.CURRVAL('[schema].sequence')。 将参数MigSupportSequence设为false,可将CURRVAL迁移为CURRVAL('[schema].sequence')。 在使用此函数之前,请复制sequence_scripts.sql文件的内容,并在所有目标数据库中执行此脚本。详情请参见执行自定义数据库脚本。 输入:CURRVAL 1 [schema.]sequence.CURRVAL 输出 1 currval('[schema.]sequence')
  • NEXTVAL 要迁移NEXTVAL,用户可使用自定义函数,根据increment_by、max_value、min_value和cycle生成下一个值。在DSC安装过程中,需在要执行迁移的所有数据库中创建该函数。 该函数支持DWS所有版本。 NEXTVAL是Oracle系统函数,GaussDB(DWS)不隐式支持该函数。为了支持该函数,DSC会在PUBLIC模式中创建一个NEXTVAL函数。迁移后的语句会使用该PUBLIC.NEXTVAL函数。 将参数MigSupportSequence设为true,可将NEXTVAL迁移为PUBLIC.NEXTVAL('[schema].sequence')。 将参数MigSupportSequence设为false,可将NEXTVAL迁移为NEXTVAL('[schema].sequence')。 在使用此函数之前,请复制sequence_scripts.sql文件的内容,并在所有目标数据库中执行此脚本。详情请参见执行自定义数据库脚本。 输入:NEXTVAL 1 [schema.]sequence.NEXTVAL 输出 1 PUBLIC.nextval('[schema.]sequence') 输入:NEXTVAL 1 2 3 4 5 6 SELECT EMP_ID_SEQ.NEXTVAL INTO SEQ_NUM FROM dual ;
  • CREATE SEQUENCE和默认值 输入:SEQUENCE,使用默认值 1 CREATE SEQUENCE seq_orders; 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 INSERT INTO PUBLIC.MIG_SEQ_TABLE ( SCHEMA_NAME ,SEQUENCE_NAME ,START_WITH ,INCREMENT_BY ,MIN_VALUE ,MAX_VALUE ,CYCLE_I ,CACHE ,ORDER_I ) VALUES ( UPPER( current_schema ( ) ) ,UPPER( 'seq_orders' ) ,1 ,1 ,1 ,999999999999999999999999999 ,FALSE ,20 ,FALSE ) ;
  • CREATE SEQUENCE和模式名 输入:CREATE SEQUENCE,使用模式名 1 2 3 4 CREATE SEQUENCE scott.seq_customers START WITH 1000 INCREMENT BY 1 MINVALUE 1000 MAXVALUE 999999999999999 CACHE 20 CYCLE ORDER; 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 INSERT INTO PUBLIC.MIG_SEQ_TABLE ( SCHEMA_NAME ,SEQUENCE_NAME ,START_WITH ,INCREMENT_BY ,MIN_VALUE ,MAX_VALUE ,CYCLE_I ,CACHE ,ORDER_I ) VALUES ( UPPER( 'scott' ) ,UPPER( 'seq_customers' ) ,1000 ,1 ,1000 ,999999999999999 ,TRUE ,20 ,FALSE ) ;
  • SEQUENCE和NOCACHE 输入:CREATE SEQUENCE,使用NOCACHE 1 2 3 4 5 CREATE SEQUENCE customers_seq START WITH 1000 INCREMENT BY 1 NOCACHE NOCYCLE; 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 INSERT INTO PUBLIC.MIG_SEQ_TABLE ( SCHEMA_NAME ,SEQUENCE_NAME ,START_WITH ,INCREMENT_BY ,MIN_VALUE ,MAX_VALUE ,CYCLE_I ,CACHE ,ORDER_I ) VALUES ( UPPER( current_schema ( ) ) ,UPPER( 'customers_seq' ) ,1000 ,1 ,1 ,999999999999999999999999999 ,FALSE ,20 ,FALSE ) ;
  • STATS_PERSISTENT 在MySQL中,STATS_PERSISTENT指定是否为InnoDB表启动持久性统计信息,通过CREATE TABLE或ALTER TABLE语句启动持久性统计信息。DSC迁移时会将该属性删除。 输入示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 CREATE TABLE `public`.`runoob_alter_test`( `dataType1` int NOT NULL AUTO_INCREMENT, `dataType2` DOUBLE(20,8), `dataType3` TEXT NOT NULL, PRIMARY KEY(`dataType1`) ) ENGINE=InnoDB, STATS_PERSISTENT=0; ## A. ALTER TABLE runoob_alter_test STATS_PERSISTENT DEFAULT; ALTER TABLE runoob_alter_test STATS_PERSISTENT=DEFAULT; ## B. ALTER TABLE runoob_alter_test STATS_PERSISTENT 0; ALTER TABLE runoob_alter_test STATS_PERSISTENT=0; ## C. ALTER TABLE runoob_alter_test STATS_PERSISTENT 1; ALTER TABLE runoob_alter_test STATS_PERSISTENT=1; 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE TABLE "public"."runoob_alter_test" ( "datatype1" SERIAL NOT NULL, "datatype2" DOUBLE PRECISION, "datatype3" TEXT NOT NULL, PRIMARY KEY ("datatype1") ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("datatype1"); -- A. -- B. -- C. 父主题: 表(可选参数、操作)
  • 授予执行权限 此功能授予用户特定包的特定权限。特定包中定义的所有过程和函数都将被授予执行权限。 输入 1 GRANT EXECUTE ON SAD.BAS_LOOKUP_MISC_PKG TO EIP_SAD; 输出 1 2 GRANT EXECUTE ON procedure_name TO EIP_SAD; GRANT EXECUTE ON function1_name TO EIP_SAD; 此处,procedure _name和function1_name必须都属于SAD.BAS_LOOKUP_MISC_PKG。 授予包的执行权限 包的最后一次授权不会被转换。 --GRANT 输入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 Below should be created as 1spec/t603.SQL CREATE OR REPLACE PACKAGE SAD.bas_dml_lookup_pkg IS FUNCTION func_name RETURN VARCHAR2; PROCEDURE data_change_logs ( pi_table_name IN VARCHAR2 , pi_table_key_columns IN VARCHAR2 , po_error_msg OUT VARCHAR2 ); END bas_dml_lookup_pkg; / GRANT EXECUTE ON SAD.bas_dml_lookup_pkg TO eip_sad; ============================== Below should be created as 2body/t603.SQL CREATE OR REPLACE PACKAGE BODY SAD.bas_dml_lookup_pkg IS g_pkg_name CONSTANT VARCHAR2(30) := 'bas_dml_ic_price_rule_pkg' ; g_func_name VARCHAR2(100); FUNCTION func_name RETURN VARCHAR2 IS l_func_name VARCHAR2(100) ; BEGIN l_func_name := g_pkg_name || '.' || g_func_name ; RETURN l_func_name ; END func_name; PROCEDURE data_change_logs ( pi_table_name IN VARCHAR2 , pi_table_key_columns IN VARCHAR2 , po_error_msg OUT VARCHAR2 ) IS BEGIN ... END data_change_logs; END bas_dml_lookup_pkg; / 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 BEGIN INSERT INTO MIG_ORA_EXT.MIG_PKG_VARIABLES ( PACKAGE_NAME,SPEC_OR_BODY,VARIABLE_NAME , VARIABLE_TYPE,CONSTANT_I,DEFAULT_VALUE , RUNTIME_EXEC_I ) VALUES ( UPPER('bas_dml_lookup_pkg'), 'B', UPPER('g_pkg_name') , UPPER( 'VARCHAR2(30)' ),TRUE,'bas_dml_ic_price_rule_pkg' , FALSE ) ; INSERT INTO MIG_ORA_EXT.MIG_PKG_VARIABLES ( PACKAGE_NAME,SPEC_OR_BODY,VARIABLE_NAME , VARIABLE_TYPE,CONSTANT_I,DEFAULT_VALUE , RUNTIME_EXEC_I ) VALUES ( UPPER('bas_dml_lookup_pkg'), 'B', UPPER( 'g_func_name' ) , UPPER( 'VARCHAR2(100)' ),FALSE,NULL , FALSE ) ; END ; / CREATE OR REPLACE FUNCTION SAD.bas_dml_lookup_pkg#bas_dml_lookup_pkg#func_name RETURN VARCHAR2 PACKAGE IS MIG_PV_VAL_DUMMY_G_PKG_NAME VARCHAR2(30) := MIG_ORA_EXT.MIG_FN_GET_PKG_VARIABLE( 'SAD' ,'bas_dml_lookup_pkg' ,'g_pkg_name' )::VARCHAR2(30); MIG_PV_VAL_DUMMY_G_FUNC_NAME VARCHAR2(100) := MIG_ORA_EXT.MIG_FN_GET_PKG_VARIABLE( 'SAD' ,'bas_dml_lookup_pkg' ,'g_func_name' )::VARCHAR2(100); l_func_name VARCHAR2 ( 100 ) ; BEGIN l_func_name := MIG_PV_VAL_DUMMY_G_PKG_NAME || '.' || MIG_PV_VAL_DUMMY_G_FUNC_NAME ; MIG_ORA_EXT.MIG_FN_SET_PKG_VARIABLE ( 'SAD' ,'bas_dml_lookup_pkg' ,'g_func_name' ,MIG_PV_VAL_DUMMY_G_FUNC_NAME ) ; MIG_ORA_EXT.MIG_FN_SET_PKG_VARIABLE ( 'SAD' ,'bas_dml_lookup_pkg' ,'g_pkg_name' ,MIG_PV_VAL_DUMMY_G_PKG_NAME ) ; RETURN l_func_name ; END ; / CREATE OR REPLACE PROCEDURE SAD.bas_dml_lookup_pkg#data_change_logs ( pi_table_name IN VARCHAR2 , pi_table_key_columns IN VARCHAR2 , po_error_msg OUT VARCHAR2 ) PACKAGE IS BEGIN ... END ; / GRANT EXECUTE ON FUNCTION SAD.bas_dml_lookup_pkg#bas_dml_lookup_pkg#func_name() TO eip_sad; GRANT EXECUTE ON FUNCTION SAD.bas_dml_lookup_pkg#data_change_logs(VARCHAR2, VARCHAR2) TO eip_sad; 父主题: Oracle语法迁移
  • CONNECT BY 输入:CONNECT BY 1 2 3 4 5 6 7 8 9 SELECT id FROM city_branch start with id=roleBranchId connect by prior id=parent_id; SELECT T.BRANCH_LEVEL, t.ID FROM city_branch c WHERE (c.branch_level = '1' OR T.BRANCH_LEVEL = '2') AND (T.SIGN = '1' OR T.SIGN = '4' OR T.SIGN = '8') AND T.STATUS = '1' START WITH c.ID = I_BRANCH_ID CONNECT BY c.ID = PRIOR c.parent_id ORDER BY c.branch_level DESC ; 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 WITH RECURSIVE migora_cte AS ( SELECT id ,1 AS LEVEL FROM city_branch WHERE id = roleBranchId UNION ALL SELECT mig_ora_cte_join_alias.id ,mig_ora_cte_tab_alias.LEVEL + 1 AS LEVEL FROM migora_cte mig_ora_cte_tab_alias INNER JOIN city_branch mig_ora_cte_join_alias ON mig_ora_cte_tab_alias.id = mig_ora_cte_join_alias.parent_id ) SELECT id FROM migora_cte ORDER BY LEVEL ; WITH RECURSIVE migora_cte AS ( SELECT BRANCH_LEVEL ,ID ,SIGN ,STATUS ,parent_id ,1 AS LEVEL FROM city_branch c WHERE c.ID = I_BRANCH_ID UNION ALL SELECT c.BRANCH_LEVEL ,c.ID ,c.SIGN ,c.STATUS ,c.parent_id ,mig_ora_cte_tab_alias.LEVEL + 1 AS LEVEL FROM migora_cte mig_ora_cte_tab_alias INNER JOIN city_branch c ON c.ID = mig_ora_cte_tab_alias.parent_id ) SELECT BRANCH_LEVEL ,ID FROM migora_cte c WHERE ( c.branch_level = '1' OR T.BRANCH_LEVEL = '2' ) AND( T.SIGN = '1' OR T.SIGN = '4' OR T.SIGN = '8' ) AND T.STATUS = '1' ORDER BY c.branch_level DESC ; 输入:多表CONNECT BY 说明了每个子行与父行的关系。该语法使用CONNECT BY xxx PRIOR子句定义当前行(子行)与前一行(父行)的关系。 1 2 3 4 5 6 7 8 9 10 11 12 SELECT DISTINCT a.id menuId, F.name menuName, a.status menuState, a.parent_id menuParentId, '-1' menuPrivilege, a.serialNo menuSerialNo FROM CTP_MENU a, CTP_MENU_NLS F START WITH a.serialno in (1, 2, 3) CONNECT BY a.id = PRIOR a.parent_id AND f.locale = Language AND a.id = f.id ORDER BY menuId, menuParentId; 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 WITH RECURSIVE migora_cte AS ( SELECT pr.service_product_id , t.enabled_flag , pr.operation_id , pr.enabled_flag , pr.product_code , 1 AS LEVEL FROM asms.cppsv_operation_sort t , asms.cppsv_product_class pr WHERE level_id = 3 AND pr.operation_id = t.operation_id(+) UNION ALL SELECT pr.service_product_id , t.enabled_flag , pr.operation_id , pr.enabled_flag , pr.product_code , mig_ora_cte_tab_alias.LEVEL + 1 AS LEVEL FROM migora_cte mig_ora_cte_tab_alias , asms.cppsv_operation_sort t , asms.cppsv_product_class pr WHERE mig_ora_cte_tab_alias.service_product_id = pr.service_product_father_id AND pr.operation_id = t.operation_id(+) ) SELECT pr.service_product_id FROM migora_cte WHERE nvl( UPPER( enabled_flag ) ,'Y' ) = 'Y' AND nvl( enabled_flag ,'Y' ) = 'Y' AND pr.product_code = rec_product1.service_product_code ORDER BY LEVEL; 父主题: Oracle语法迁移
  • PASSWORD 在MySQL中,PASSWORD表示用户密码。GaussDB(DWS)不支持该参数,DSC迁移时会将该关键字删除。 输入示例 1 2 3 4 5 6 7 CREATE TABLE `public`.`runoob_alter_test`( `dataType1` int NOT NULL AUTO_INCREMENT, `dataType2` DOUBLE(20,8), `dataType3` TEXT NOT NULL, PRIMARY KEY(`dataType1`) ); ALTER TABLE runoob_alter_test PASSWORD 'HELLO'; 输出示例 1 2 3 4 5 6 7 8 9 10 CREATE TABLE "public"."runoob_alter_test" ( "datatype1" SERIAL NOT NULL, "datatype2" DOUBLE PRECISION, "datatype3" TEXT NOT NULL, PRIMARY KEY ("datatype1") ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("datatype1"); 父主题: 表(可选参数、操作)
  • LOW_PRIORITY MySQL UPDATE语句如果使用LOW_PRIORITY修饰符,则执行UPDATE延迟。 输入示例 1 2 #测试 LOW_PRIORITY 语法点 UPDATE LOW_PRIORITY employees SET department_id=2; 输出示例 1 2 --测试 LOW_PRIORITY 语法点 UPDATE "public"."employees" SET "department_id" = 2; 父主题: UPDATE
共100000条