华为云用户手册

  • 设置Java内存分配 DSC支持通过参数控制Java虚拟机(JVM)的内存分配量,并预设默认值。 在迁移操作期间,如果内存使用超过设置的值,DSC将提示“java.lang.OutOfMemoryError: GC overhead limit exceeded”错误消息并退出,此时用户可通过更改application.properties配置文件中的initialJVMMemory和maxJVMMemory 的值,以分配更多内存。 可用系统资源决定了内存分配量。 表2 JVM内存分配的控制参数 参数 说明 推荐取值 Xms 指定初始内存分配量,单位为MB。 该参数最小值为256 MB,最大值取决于可用的系统资源。 默认值:256 Xmx 指定内存分配量的上限,单位为MB。 该参数最小值为1024 MB,最大值取决于可用的系统资源。 默认值:1024 打开校验模块config文件夹下的gaussdb.properties文件,参照表3,配置参数以连接 GaussDB (DWS)。 表3 gaussdb.properties文件内参数 参数名 描述 取值范围 默认值 样例 gaussdb-user GaussDB(DWS)数据库用户,拥有全部权限。 NA NA user1 gaussdb-port GaussDB(DWS)数据库端口号。 NA NA 8000 gaussdb-name GaussDB(DWS)的数据库名称。 NA NA gaussdb gaussdb-ip GaussDB(DWS)数据库IP地址。 NA NA 10.XX.XX.XX
  • 设置application.properties application.properties文件中包括一系列应用配置参数,用于控制DSC在迁移数据库脚本时的行为,该文件中的参数为通用控制参数,适用于Teradata、MySQL迁移。 设置方法如下。 打开config文件夹中的application.properties文件。 根据实际需要修改application.properties文件中参数的值。 application.properties文件中的参数解释见表1。 参数值不区分大小写。 除了列出的参数外,用户不得更改任何参数值。 保存后退出。
  • MULTISET MULTISET是一个普通表,所有数据库都支持这个表。迁移工具同时支持MULTISET和SET表。 MULTISET表支持与VOLATILE一起使用。 输入:CREATE MULTISET TABLE 1 CREATE VOLATILE MULTISET TABLE T1 (c1 int ,c2 int); 输出: 1 2 3 4 5 6 7 CREATE LOCAL TEMPORARY TABLE T1 ( c1 INTEGER ,c2 INTEGER ) ; 父主题: 表迁移
  • CREATE TABLE Teradata的CREATE TABLE (缩写关键字为CT)语句用于创建表。 示例: 输入:CREATE TABLE 1 2 3 CT tab1 ( id INT ); 输出: 1 2 3 4 5 6 CREATE TABLE tab1 ( id INTEGER ) ; 执行CREATE tab2 AS tab1时,从tab1中复制的结构将用于创建表tab2。如果CREATE TABLE语句包含WITH DATA选项,则会将tab1的数据也复制到tab2中。使用CREATE AS时,源表中的CONSTRAINT行将保留在新表中。 如果session_mode设为Teradata,则必须删除目标表中的重复记录。该操作通过在迁移脚本中添加MINUS运算符实现。 如果session_mode设为ANSI,则允许目标表中存在重复记录。 如果源表具有PRIMARY KEY(主键)或UNIQUE CONSTRAINT(唯一约束),则该表不包含任何重复记录。在这种情况下,不需要添加MINUS操作符删除重复的记录。 示例: 输入:CREATE TABLE AS WITH DATA(session_mode=Teradata) 1 2 CREATE TABLE tab2 AS tab1 WITH DATA; 输出: 1 2 3 4 5 6 7 8 9 10 11 BEGIN CREATE TABLE tab2 ( LIKE tab1 INCLUDING ALL EXCLUDING PARTITION EXCLUDING RELOPTIONS ); INSERT INTO tab2 SELECT * FROM tab1 MINUS SELECT * FROM tab2; END ; / 输入:CREATE TABLE AS WITH DATA AND STATIS TICS 1 2 3 4 CREATE SET VOLATILE TABLE tab2025 AS ( SELECT * from tab2023 ) WITH DATA AND STATISTI CS PRIMARY INDEX ( LOG TYPE, OPERSEQ); 输出: 1 2 3 4 5 CREATE LOCAL TEMPORARY TABLE tab2025 DISTRIBUTE BY HASH ( LOGTYPE, OPERSEQ ) AS ( SELECT * FROM tab2023 ); ANALYZE tab2025; 父主题: 表迁移
  • SPATIAL空间索引 GaussDB(DWS)不支持SPATIAL空间索引。DSC工具迁移时会根据GaussDB(DWS)的特性进行相应适配。 内联SPATIAL空间索引。 输入示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CREATE TABLE `public`.`test_create_table04` ( `ID` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `A` POINT NOT NULL, `B` POLYGON NOT NULL, `C` GEOMETRYCOLLECTION NOT NULL, `D` LINESTRING NOT NULL, `E` MULTILINESTRING NOT NULL, `F` MULTIPOINT NOT NULL, `G` MULTIPOLYGON NOT NULL, SPATIAL INDEX A_INDEX(A), SPATIAL INDEX B_INDEX(B), SPATIAL INDEX C_INDEX(C), SPATIAL KEY D_INDEX(D), SPATIAL KEY E_INDEX(E), SPATIAL KEY F_INDEX(F), SPATIAL INDEX G_INDEX(G) ); 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 CREATE TABLE "public"."test_create_table04" ( "id" SERIAL NOT NULL PRIMARY KEY, "a" POINT NOT NULL, "b" POLYGON NOT NULL, "c" GEOMETRYCOLLECTION NOT NULL, "d" POLYGON NOT NULL, "e" BOX NOT NULL, "f" BOX NOT NULL, "g" POLYGON NOT NULL ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("id"); CREATE INDEX "a_index" ON "public"."test_create_table04" USING GIST ("a"); CREATE INDEX "b_index" ON "public"."test_create_table04" USING GIST ("b"); CREATE INDEX "c_index" ON "public"."test_create_table04" USING GIST ("c"); CREATE INDEX "d_index" ON "public"."test_create_table04" USING GIST ("d"); CREATE INDEX "e_index" ON "public"."test_create_table04" USING GIST ("e"); CREATE INDEX "f_index" ON "public"."test_create_table04" USING GIST ("f"); CREATE INDEX "g_index" ON "public"."test_create_table04" USING GIST ("g"); ALTER TABLE创建SPATIAL空间索引。 输入示例 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE `public`.`test_create_table04` ( `ID` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `A` POINT NOT NULL, `B` POLYGON NOT NULL, `C` GEOMETRYCOLLECTION NOT NULL, `D` LINESTRING NOT NULL, `E` MULTILINESTRING NOT NULL, `F` MULTIPOINT NOT NULL, `G` MULTIPOLYGON NOT NULL ); ALTER TABLE `test_create_table04` ADD SPATIAL INDEX A_INDEX(A); ALTER TABLE `test_create_table04` ADD SPATIAL INDEX E_INDEX(E) USING BTREE; 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CREATE TABLE "public"."test_create_table04" ( "id" SERIAL NOT NULL PRIMARY KEY, "a" POINT NOT NULL, "b" POLYGON NOT NULL, "c" GEOMETRYCOLLECTION NOT NULL, "d" POLYGON NOT NULL, "e" BOX NOT NULL, "f" BOX NOT NULL, "g" POLYGON NOT NULL ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("id"); CREATE INDEX "a_index" ON "public"."test_create_table04" USING GIST ("a"); CREATE INDEX "e_index" ON "public"."test_create_table04" USING GIST ("e"); CREATE INDEX创建SPATIAL空间索引。 输入示例 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE `public`.`test_create_table04` ( `ID` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `A` POINT NOT NULL, `B` POLYGON NOT NULL, `C` GEOMETRYCOLLECTION NOT NULL, `D` LINESTRING NOT NULL, `E` MULTILINESTRING NOT NULL, `F` MULTIPOINT NOT NULL, `G` MULTIPOLYGON NOT NULL ); CREATE SPATIAL INDEX A_INDEX ON `test_create_table04`(A); 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE TABLE "public"."test_create_table04" ( "id" SERIAL NOT NULL PRIMARY KEY, "a" POINT NOT NULL, "b" POLYGON NOT NULL, "c" GEOMETRYCOLLECTION NOT NULL, "d" POLYGON NOT NULL, "e" BOX NOT NULL, "f" BOX NOT NULL, "g" POLYGON NOT NULL ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("id"); CREATE INDEX "a_index" ON "public"."test_create_table04" USING GIST ("a"); 父主题: 索引
  • 类型对照 输入示例BOOL/BOOLEAN 1 2 3 4 5 CREATE TABLE IF NOT EXISTS `runoob_dataType_test`( `dataType_1` INT, `dataType_2` BOOL, `dataType_3` BOOLEAN ); 输出示例 1 2 3 4 5 6 7 8 9 CREATE TABLE IF NOT EXISTS "public"."runoob_datatype_test" ( "datatype_1" INTEGER, "datatype_2" BOOLEAN, "datatype_3" BOOLEAN ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("datatype_1");
  • 数据类型 子类型 包中的自定义类型无法被转换。 SUBTYPE error_msg IS sad_products_t.exception_description%TYPE; SUBTYPE AR_FLAG IS SAD_RA_LINES_TI.AR_FLAG%TYPE; SUBTYPE LOCK_FLAG IS SAD_SHIPMENT_BATCHES_T.LOCK_FLAG%TYPE; bas_subtype_pkg.error_msg 输入: 1 2 3 4 5 6 7 8 9 CREATE OR REPLACE PACKAGE SAD.bas_subtype_pkg IS SUBTYPE func_name IS sad_products_t.func_name%TYPE; END bas_subtype_pkg; / CREATE OR REPLACE PACKAGE BODY SAD.bas_subtype_pkg IS BEGIN NULL; END bas_subtype_pkg; / 输出: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 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 bas_subtype_pkg.func_name;; BEGIN l_func_name := g_pkg_name || '.' || g_func_name ; RETURN l_func_name ; END func_name; END bas_dml_lookup_pkg; / %ROWTYPE 包的过程/函数包含 IN/OUT参数中的%ROWTYPE属性,此功能不被支持。 脚本:BAS_DML_SERVIECE_PKG.SQL, BAS_LOOKUP_MISC_PKG.SQL 输入: 1 2 3 4 5 6 7 8 CREATE OR REPLACE PACKAGE BODY "SAD"."BAS_DML_SERVIECE_PKG" IS PROCEDURE save_split_ou(pi_split_ou IN split_ou%ROWTYPE, po_error_msg OUT VARCHAR2) IS --- BEGIN --- end save_split_ou; end BAS_DML_SERVIECE_PKG; 输出: 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE OR REPLACE PROCEDURE SAD.BAS_DML_SERVIECE_PKG#save_split_ou ( pi_split_ou IN split_ou%ROWTYPE ,po_error_msg OUT VARCHAR2 ) IS MIG_PV_VAL_DUMMY_G_FUNC_NAME VARCHAR2 ( 30 ) := MIG_ORA_EXT.MIG_FN_GET_PKG_VARIABLE ( current_schema ( ) ,'BAS_DML_SERVIECE_PKG' ,'g_func_name' ) ::VARCHAR2 ( 30 ) ; ex_data_error EXCEPTION ; ex_prog_error EXCEPTION ; --- BEGIN --- END; 输入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE OR REPLACE PACKAGE BODY SAD.BAS_DML_SERVIECE_PKG IS PROCEDURE save_split_ou(pi_split_ou IN split_ou%ROWTYPE, po_error_msg OUT VARCHAR2) IS BEGIN UPDATE split_ou so SET so.auto_balance_flag = pi_split_ou.auto_balance_flag, so.balance_start_date = pi_split_ou.balance_start_date, so.balance_source = pi_split_ou.balance_source WHERE so.dept_code = pi_split_ou.dept_code; EXCEPTION WHEN OTHERS THEN po_error_msg := 'Others Exception raise in ' || g_func_name || ',' || SQLERRM; END save_split_ou; END bas_dml_serviece_pkg; / 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 CREATE TYPE mig_typ_split_ou AS ...; CREATE OR REPLACE PROCEDURE SAD.BAS_DML_SERVIECE_PKG#save_split_ou ( pi_split_ou IN mig_typ_split_ou ,po_error_msg OUT VARCHAR2 ) PACKAGE IS BEGIN UPDATE split_ou so SET so.auto_balance_flag = pi_split_ou.auto_balance_flag ,so.balance_start_date = pi_split_ou.balance_start_date ,so.balance_source = pi_split_ou.balance_source WHERE so.dept_code = pi_split_ou.dept_code ; EXCEPTION WHEN OTHERS THEN po_error_msg := 'Others Exception raise in ' || g_func_name || ',' || SQLERRM ; END ; / 父主题: Oracle语法迁移
  • 注意事项 禁止修改导出的文件和内容,否则可能无法恢复成功。 为了保证数据一致性和完整性,gs_dumpall会对需要转储的表设置共享锁。如果某张表在别的事务中设置了共享锁,gs_dumpall会等待此表的锁释放后锁定此表。如果无法在指定时间内锁定某张表,转储会失败。用户可以通过指定--lock-wait-timeout选项,自定义等待锁超时时间。 由于gs_dumpall读取所有数据库中的表,因此必须以数据库集群管理员身份进行连接,才能导出完整文件。在使用gsql执行脚本文件导入时,同样需要管理员权限,以便添加用户和组,以及创建数据库。
  • 背景信息 gs_dumpall是GaussDB(DWS)用于导出所有数据库相关信息工具,它可以导出集群数据库的所有数据,包括默认数据库postgres的数据、自定义数据库的数据、以及集群所有数据库公共的全局对象。 gs_dumpall工具在进行数据导出时,其他用户可以访问集群数据库(读或写)。 gs_dumpall工具支持导出完整一致的数据。例如,T1时刻启动gs_dumpall导出整个集群数据库,那么导出数据结果将会是T1时刻该集群数据库的数据状态,T1时刻之后对集群数据库的修改不会被导出。 gs_dumpall在导出整个集群所有数据库时分为两部分: gs_dumpall自身对所有数据库公共的全局对象进行导出,包括有关数据库用户和组,表空间以及属性(例如,适用于数据库整体的访问权限)信息。 gs_dumpall通过调用gs_dump来完成集群中各数据库的SQL脚本文件导出,该脚本文件包含将数据库恢复为其保存时的状态所需要的全部SQL语句。 以上两部分导出的结果为纯文本格式的SQL脚本文件,使用gsql运行该脚本文件可以恢复集群数据库。
  • 参数说明 通用参数: -f, --filename=FILENAME 将输出发送至指定文件。如果这里省略,则使用标准输出。 -v, --verbose 指定verbose模式。该选项将导致gs_dumpall向转储文件输出详细的对象注解和启动/停止次数,向标准错误流输出处理信息。 -V, --version 打印gs_dumpall版本,然后退出。 --lock-wait-timeout=TIMEOUT 请勿在转储刚开始时一直等待以获取共享表锁。如果无法在指定时间内锁定某个表,就选择失败。可以以任何符合SET statement_timeout的格式指定超时时间。 -?, --help 显示gs_dumpall命令行参数帮助,然后退出。 转储参数: -a, --data-only 只转储数据,不转储模式(数据定义)。 -c, --clean 在重新创建数据库之前,执行SQL语句清理(删除)这些数据库。针对角色和表空间的转储命令已添加。 -g, --globals-only 只转储全局对象(角色和表空间),无数据库。 -o, --oids 转储每个表的对象标识符(OIDs),作为表的一部分数据。该选项用于应用以某种方式(例如:外键约束方式)参照了OID列的情况。如果不是以上这种情况,请勿使用该选项。 -O, --no-owner 不输出设置对象的归属这样的命令,以匹配原始数据库。默认情况下,gs_dumpall会发出ALTER OWNER或SET SESSION AUTHORIZATION语句设置所创建的模式元素的所属。如果脚本正在运行,该语句不会执行成功,除非是由系统管理员触发(或是拥有脚本中所有对象的同一个用户)。通过指定-O,编写一个任何用户都能存储的脚本,且该脚本会授予该用户拥有所有对象的权限。 -r, --roles-only 只转储角色,不转储数据库或表空间。 -s, --schema-only 只转储对象定义(模式),而非数据。 -S, --sysadmin=NAME 在转储过程中使用的系统管理员名称。 -t, --tablespaces-only 只转储表空间,不转储数据库或角色。 -x, --no-privileges 防止转储访问权限(授权/撤销命令)。 --column-inserts|--attribute-inserts 以INSERT命令带列名(INSERT INTO表(列、…)值…)方式导出数据。这会导致恢复缓慢。但是由于该选项会针对每行生成一个独立分开的命令,所以在重新加载某行时出现的错误只会导致那行丢失,而非整个表内容。 --disable-dollar-quoting 该选项将禁止在函数体前使用美元符号$,并强制使用SQL标准字符串语法对其进行引用。 --disable-triggers 该参数为扩展预留接口,不建议使用。 --inserts 发出INSERT命令(而非COPY命令)时转储数据。这会导致恢复缓慢。注意如果重排列顺序,可能会导致恢复整个失败。--column-inserts选项更加安全,虽然可能更慢些。 --no-security-labels 该参数为扩展预留接口,不建议使用。 --no-tablespaces 该参数在8.2.0.100版本中已废弃,为兼容历史版本功能保留该函数。 请勿输出创建表空间的命令,也请勿针对对象选择表空间。使用该选项,无论默认表空间是哪个,在恢复过程中所有对象都会被创建。 --no-unlogged-table-data 该参数为扩展预留接口,不建议使用。 --quote-all-identifiers 强制对所有标识符加引号。为了向后续版本迁移,且其中可能涉及引入额外关键词,在转储相应数据库时该选项会有帮助。 --dont-overwrite-file 不重写当前文件。 --use-set-session-authorization 输出符合SQL标准的SET SESSION AUTHORIZATION命令而不是ALTER OWNER命令来确定对象所有权。这样令转储更加符合标准,但是如果转储文件中的对象的历史有些问题,那么可能不能正确恢复。并且,使用SET SESSION AUTHORIZATION的转储需要数据库系统管理员的权限才能转储成功,而ALTER OWNER需要的权限则低得多。 --with-encryption=AES128 指定转储数据需用AES128进行加密。 --with-key=KEY AES128密钥长度必须是16字节。 --include-extensions 如果include-extensions参数被设置,将备份所有的CREATE EXTENSION语句。 --include-templatedb 转储过程中包含模板库。 --dump-nodes 转储过程中包含节点和Node Group。 --include-nodes 将TO NODE语句包含在已转储的CREATE TABLE命令中。 --include-buckets 该参数为扩展预留接口,不建议使用。 --dump-wrm 存储过程中包含负载资源管理器,具体包括资源池、负载组以及负载组映射。 --binary-upgrade 该参数为扩展预留接口,不建议使用。 --binary-upgrade-usermap="USER1=USER2" 该参数为扩展预留接口,不建议使用。 --tablespaces-postfix 该参数为扩展预留接口,不建议使用。 --parallel-jobs 指定备份进程并发数,取值范围为1~1000。
  • 迁移后验证 Database Schema Convertor转换完含有SQL语句的源文件后,在目标GaussDB(DWS)上执行转换后的文件,并生成文件执行成功和失败的明细报告。 Database Schema Convertor完成迁移后,会调用迁移后验证脚本(通过配置项控制)。此验证脚本(配置详情见配置文件)会连接到目标 GaussDB数据库 并执行。 迁移后验证脚本会连接到目标GaussDB数据库(具体信息在配置文件中配置),并执行该脚本。 配置config文件夹下的application.properties 在GaussDB中执行迁移脚本的取值范围:true/false,默认值:false。 将executesqlingauss设置为true。 true: executesqlingauss将在GaussDB上执行迁移脚本。 配置config文件夹下的gaussdb.properties #目标数据库配置 #gauss database user with all privileges gaussdb-user= gaussdb-port= #Database name for GaussDBA gaussdb-name= #gaussdb ip gaussdb-ip= gsql客户端的依赖关系: 由于在GaussDB上执行脚本时需依赖gsql(GaussDB(DWS)),为保证Database Schema Convertor正常运行,需在安装了GaussDB实例或客户端(gsql)的节点上运行Database Schema Convertor,且进行验证的用户具有执行gsql命令的权限。 由于Gauss数据库实例/客户端只能安装在Linux操作系统中,因此只能用于Linux环境下的功能验证。 在远程GaussDB实例上执行gsql命令,建议在GaussDB实例的如下配置文件中增加客户端系统IP或主机名。 /home/gsmig/database/coordinator ---pg_hba.conf 回显 GaussDB(DWS) ********************** Verification Started ****************************** Sql script execution on Gauss DB start time : Wed Jan 22 17:27:07 CST 2020 Sql script execution on Gauss DB end time : Wed Jan 22 17:27:44 CST 2020 Summary of Verification : ================================================================================================================================== Statement | Total | Passed | Failed | Success Rate(%) ----------------------------------------------------------------------------------------------------------------------------------- COMMENT | 15 | 15 | 0 | 100 CREATE VIEW | 4 | 3 | 1 | 75 CREATE INDEX | 4 | 3 | 1 | 75 CREATE TABLE | 6 | 6 | 0 | 100 ALTER TABLE | 3 | 3 | 0 | 100 --------------------------------------------------------------------------------------------------------------------------------- Total | 32 | 30 | 2 | 93 Gauss Execution Log file : /home/gsmig/18Jan/DSC/DSC/log/gaussexecutionlog.log Gauss Execution Error Log file : /home/gsmig/18Jan/DSC/DSC/log/gaussexecutionerror.log Verification finished in 38 seconds ********************** Verification Completed ****************************
  • PACK_KEYS 在MySQL中,PACK_KEYS表示MyISAM存储引擎中的压缩索引。GaussDB(DWS)不支持该属性,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=MyISAM PACK_KEYS=1; ##A ALTER TABLE runoob_alter_test PACK_KEYS 0; ALTER TABLE runoob_alter_test PACK_KEYS=0; ##B ALTER TABLE runoob_alter_test PACK_KEYS 1; ALTER TABLE runoob_alter_test PACK_KEYS=1; ##C ALTER TABLE runoob_alter_test PACK_KEYS DEFAULT; ALTER TABLE runoob_alter_test PACK_KEYS=DEFAULT; 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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 父主题: 表(可选参数、操作)
  • 示例 数据文件存放在“/data” 目录,IP为192.168.0.90,监听端口为5000。 gds -d /data/ -p 192.168.0.90:5000 -H 10.10.0.1/24 数据文件存放在“/data/” 目录下的任意子目录,IP为192.168.0.90,监听端口为5000。 gds -d /data/ -p 192.168.0.90:5000 -H 10.10.0.1/24 -r 数据文件存放在“/data/ ”目录,IP为192.168.0.90,监听端口为5000,以后台方式运行,将日志保存在“/log/gds_log.txt”文件中,指定并发导入工作线程数目为32。 gds -d /data/ -p 192.168.0.90:5000 -H 10.10.0.1/24 -l /log/gds_log.txt -D -t 32 数据文件存放在“/data/ ”目录,IP为192.168.0.90,监听端口为5000,只允许IP为10.10.0.*的节点进行连接。 gds -d /data/ -p 192.168.0.90:5000 -H 10.10.0.1/24 数据文件存放在“/data/ ”目录,IP为192.168.0.90,监听端口为5000,只允许IP为10.10.0.*的节点进行连接,设定为使用SSL认证的方式与集群通信,证书文件存放在/certfiles/目录。 gds -d /data/ -p 192.168.0.90:5000 -H 10.10.0.1/24 --enable-ssl --ssl-dir /certfiles/ 1个GDS在同一时刻,只能为1个集群提供导入导出服务; 为满足安全要求,请通过-p显式指定监听ip和监听端口。 证书文件包括根证书文件cacert.pem,以及二级证书文件client.crt和密钥文件client.key。 在加载证书时,需要使用密码保护文件client.key.rand和client.key.cipher。
  • 授予执行权限 此功能授予用户特定包的特定权限。特定包中定义的所有过程和函数都将被授予执行权限。 输入 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语法迁移
  • VARRAY REF CURSOR定义为返回参数。 设置plSQLCollection=varray后进行迁移。 输入: VARRAY 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 CREATE OR REPLACE TYPE TYPE_RMTS_ARRAYTYPE IS TABLE OF VARCHAR2 (30000); CREATE OR REPLACE PACKAGE BODY SCMS_STRING_UTILS As FUNCTION END_WITH (SRCSTRING VARCHAR2, --Source character string ENDCHAR VARCHAR2, --End character string IGNORECASE BOOLEAN --Ignore Case ) RETURN BOOLEAN IS SRCLEN NUMBER (20) := LENGTH(SRCSTRING); ENDLEN NUMBER (20) := LENGTH(ENDCHAR); V_TOKEN_ARRAY TYPE_RMTS_ARRAYTYPE := TYPE_RMTS_ARRAYTYPE (); V_TOKEN_ARRAY1 TYPE_RMTS_ARRAYTYPE := TYPE_RMTS_ARRAYTYPE (); I NUMBER (20) := 1; TMP_CHAR VARCHAR(1); TMP_CHAR1 VARCHAR(1); BEGIN ... END; END; / 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CREATE OR REPLACE FUNCTION SCMS_STRING_UTILS.END_WITH (SRCSTRING VARCHAR2 /* source character string */ , ENDCHAR VARCHAR2 /* End character string */ , IGNORECASE BOOLEAN /* Ignore case */ ) RETURN BOOLEAN IS SRCLEN NUMBER (20) := LENGTH(SRCSTRING); ENDLEN NUMBER (20) := LENGTH(ENDCHAR); TYPE TYPE_RMTS_ARRAYTYPE IS VARRAY (1024) OF VARCHAR2 (30000); V_TOKEN_ARRAY TYPE_RMTS_ARRAYTYPE /*:= TYPE_RMTS_ARRAYTYPE()*/ ; V_TOKEN_ARRAY1 TYPE_RMTS_ARRAYTYPE /*:= TYPE_RMTS_ARRAYTYPE()*/ ; I NUMBER (20) := 1; TMP_CHAR VARCHAR(1); TMP_CHAR1 VARCHAR(1); BEGIN END; 父主题: Oracle语法迁移
  • 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包
  • 创建包模式 包声明迁移为创建以包名命名的模式。设置pkgSchemaNaming=false后,可以进行迁移。 输入:为包创建模式名 1 2 3 4 5 6 7 8 9 CREATE OR REPLACE EDITIONABLE PACKAGE "PACK_DEMO"."PACKAGE_GET_NOVA_INFO" AS TYPE novalistcur is REF CURSOR; PROCEDURE getNovaInfo ( i_appEnShortName IN VARCHAR2, o_flag OUT VARCHAR2, o_errormsg OUT VARCHAR2, o_novalist OUT novalistcur ); 输出 1 2 3 4 /*~~PACKAGE_GET_NOVA_INFO~~*/ CREATE SCHEMA PACKAGE_GET_NOVA_INFO ; 父主题: PL/SQL包
  • 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语法迁移
  • OUTER QUERY (+) GaussDB(DWS)支持JOIN,因此添加supportJoinOperator配置参数。 设置supportJoinOperator=false后OUTER QUERY (+)可迁移。 输入:OUTER QUERY(+) 1 2 3 4 5 6 7 8 9 SELECT PP.PUBLISH_NO FROM SPMS_PA RAM _PUBLISH PP WHERE PP.PUBLISH_ID(+) = TB2.PUBLISH_ID; SELECT I.APP_CHNAME, I.APP_SHORTNAME FROM SPMS_APPVERSION SA, SPMS_APP_INFO I WHERE SA.APP_ID = I.APP_ID(+) AND SA.DELIVERY_USER = IN_USERID ORDER BY APPVER_ID DESC ; 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 SELECT PP.PUBLISH_NO FROM SPMS_PARAM_PUBLISH PP WHERE PP.PUBLISH_ID (+) = TB2.PUBLISH_ID ; SELECT I.APP_CHNAME ,I.APP_SHORTNAME FROM SPMS_APPVERSION SA ,SPMS_APP_INFO I WHERE SA.APP_ID = I.APP_ID (+) AND SA.DELIVERY_USER = IN_USERID ORDER BY APPVER_ID DESC ; 父主题: Oracle语法迁移
  • PL/SQL包 本节主要介绍Oracle PL/SQL包(详情请参见包)和REF CURSOR(详情请参见REF CURSOR)的迁移语法。迁移语法决定了关键字/功能的迁移方式。 本节包括以下内容: 包、包变量、包拆分、REF CURSOR、VARRAY、创建包模式、授予执行权限、包名列表、数据类型,各节点的具体内容详见包~数据类型章节。 包 包变量 包拆分 REF CURSOR 创建包模式 父主题: Oracle语法迁移
  • EXTEND GaussDB(DWS)支持EXTEND关键字。 输入: EXTEND FUNCTION FUNC_EXTEND ( in_str IN VARCHAR2) RETURN ARRYTYPE AS v_count2 INTEGER; v_strlist arrytype; v_node VARCHAR2 (2000); BEGIN v_count2 := 0; v_strlist := arrytype (); FOR v_i IN 1 .. LENGTH (in_str) LOOP IF v_node IS NULL THEN v_node := ''; END IF; IF (v_count2 = 0) OR (v_count2 IS NULL) THEN EXIT; ELSE v_strlist.EXTEND (); v_strlist (v_i) := v_node; v_node := ''; END IF; END LOOP; RETURN v_strlist; END; / 输出 FUNCTION FUNC_EXTEND ( in_str IN VARCHAR2 ) RETURN ARRYTYPE AS v_count2 INTEGER ; v_strlist arrytype ; v_node VARCHAR2 ( 2000 ) ; BEGIN v_count2 := 0 ; v_strlist := arrytype ( ) ; FOR v_i IN 1.. LENGTH( in_str ) LOOP IF v_node IS NULL THEN v_node := '' ; END IF ; IF ( v_count2 = 0 ) OR( v_count2 IS NULL ) THEN EXIT ; ELSE v_strlist.EXTEND ( 1 ) ; v_strlist ( v_i ) := v_node ; v_node := '' ; END IF ; END LOOP ; RETURN v_strlist ; END ; /
  • SUBTYPE SUBTYPE语句中,PL/SQL允许您定义自己的子类型或预定义数据类型的别名,有时称为抽象数据类型。 输入 CREATE OR REPLACE PACKAGE "SAD"."BAS_SUBTYPE_PKG" IS SUBTYPE CURRENCY IS BAS_PRICE_LIST_T.CURRENCY%TYPE; END bas_subtype_pkg; / CREATE OR REPLACE PACKAGE BODY "SAD"."BAS_SUBTYPE_PKG" IS BEGIN NULL; END bas_subtype_pkg; / --******************************************************************** CREATE OR REPLACE PACKAGE BODY SAD.bas_lookup_misc_pkg IS FUNCTION get_currency(pi_price_type IN NUMBER) RETURN VARCHAR2 IS v_currency bas_subtype_pkg.currency; BEGIN g_func_name := 'get_currency'; FOR rec_currency IN (SELECT currency FROM sad_price_type_v WHERE price_type_code = pi_price_type) LOOP v_currency := rec_currency.currency; END LOOP; RETURN v_currency; END get_currency; END SAD.bas_lookup_misc_pkg; /
  • TYPE命名约定 用户定义的类型允许定义数据类型,以模拟应用程序中数据的结构和行为。 输入 CREATE TYPE t_line AS ( product_line VARCHAR2 ( 30 ) ,product_amount NUMBER ) ; ; 输出 CREATE TYPE sad_dml_product_pkg.t_line AS ( product_line VARCHAR2 ( 30 ) ,product_amount NUMBER ) ; 输入 CREATE TYPE t_line AS ( product_line VARCHAR2 ( 30 ) ,product_amount NUMBER ) ;
  • AUTONOMOUS 输入:AUTONOMOUS 1 2 3 CREATE OR REPLACE EDITIONABLE PACKAGE BODY "Pack1"."DEMO_PROC" is PROCEDURE log(proc_name IN VARCHAR2, info IN VARCHAR2) IS PRAGMA AUTONOMOUS_TRANSACTION; 输出 1 2 CREATE OR REPLACE PROCEDURE DEMO_PROC.log ( proc_name IN VARCHAR2 ,info IN VARCHAR2 ) IS /*PRAGMA AUTONOMOUS_TRANSACTION;*/
  • ALTER SESSION Oracle中的ALTER SESSION语句用于设置或修改数据库连接的参数和行为。该语句将持续有效,除非数据库连接断开。DSC可迁移如下形式的ALTER SESSION语句: 含有ADVISE、ENABLE、DISABLE、CLOSE和FORCE的ALTER SESSION语句将被迁移为注释脚本。 含有SET CLAUSE参数(例如:NLS_DATE_FORMAT和NLS_DATE_LANGUAGE等)的ALTER SESSION语句将被逐字复制。 该工具不支持迁移命令子句含有变量的ALTER SESSION语句。 例如:EXECUTE IMMEDIATE ' alter session ' || command_val || 'parallel ' || type_value. 示例中,command_val是变量,不受DSC支持。不支持的语句将被逐字复制到已迁移的脚本中。 输入:ALTER SESSION 1 2 3 4 5 ALTER SESSION ENABLE PARALLEL DDL; ALTER SESSION ADVISE COMMIT; ALTER SESSION CLOSE DATABASE LINK local; ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY MM DD HH24:MI:SS'; ALTER SESSION SET current_schema = 'isfc'; 输出 1 2 3 4 5 /*ALTER SESSION ENABLE PARALLEL DDL;*/ /*ALTER SESSION ADVISE COMMIT;*/ /*ALTER SESSION CLOSE DATABASE LINK local;*/ ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY MM DD HH24:MI:SS'; ALTER SESSION SET current_schema = 'isfc'; 输入:ALTER SESSION 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE OR REPLACE PROCEDURE PUBLIC .TEST_CALL is command_val varchar2 ( 1000 ) ; type_value number ; BEGIN command_val := 'enable parallel ddl' ; dbms_output.put_line ( mike ) ; -- execute immediate 'ALTER SESSION DISABLE GUARD' ; execute immediate 'ALTER SESSION ADVISE ROLLBACK' ; EXECUTE IMMEDIATE ' alter session ' || command_val || 'parallel ' || type_value ; END TEST_CALL; / 输出 1 2 3 4 5 6 7 8 9 10 11 12 CREATE OR REPLACE PROCEDURE PUBLIC.TEST_CALL is command_val varchar2 ( 1000 ) ; type_value number ; BEGIN command_val := 'enable parallel ddl' ; dbms_output.put_line ( mike ) ; /* execute immediate 'ALTER SESSION DISABLE GUARD' ; */ execute immediate '/*ALTER SESSION ADVISE ROLLBACK*/' ; EXECUTE IMMEDIATE 'alter session ' || command_val || 'parallel ' || type_value ; END ; /
  • END 不支持END指定标签。因此,迁移期间将删除标签名称。 输入:END,使用过程名 1 2 3 4 5 CREATE OR REPLACE PROCEDURE sp_ins_emp … … ... END sp_ins_emp; 输出 1 2 3 4 5 CREATE OR REPLACE PROCEDURE sp_ins_emp … … ... END; 输入:END,使用函数名 1 2 3 4 5 6 CREATE FUNCTION fn_get_bal … … ... END get_bal; / 输出 1 2 3 4 5 6 CREATE FUNCTION fn_get_bal … … ... END; /
  • 替换变量 替换变量是Oracle SQL * Plus工具的一个特性。 当在一个语句中使用一个替换变量时,SQL * Plus会请求一个输入值并重写该语句以将其包含在内。 重写的语句被传递到Oracle数据库。 当输入的Oracle脚本包含任何替换变量时,DSC将显示以下消息。消息记录在控制台和日志文件中。 ************************************************************************** USER ATTENTION!!! Variable: &bbid should be substituted in the file : "/home/testmigration/V100R002C60/MigrationTool/Input/proc_frss_jczbsc.SQL" Variable: &wdbs should be substituted in the file : "/home/testmigration/V100R002C60/MigrationTool/Input/proc_frss_jczbsc.SQL" Variable: &batch_no should be substituted in the file : "/home/testmigration/V100R002C60/MigrationTool/Input/proc_frss_jczbsc.SQL" **************************************************************************
  • LONG 数据类型LONG迁移为TEXT。 输入:LONG 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE OR REPLACE FUNCTION fn_proj_det ( i_proj_cd INT ) RETURN LONG IS v_proj_det LONG; BEGIN SELECT proj_det INTO v_proj_det FROM project WHERE proj_cd = i_proj_cd; RETURN v_proj_det; END; / 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE OR REPLACE FUNCTION fn_proj_det ( i_proj_cd INT ) RETURN TEXT IS v_proj_det TEXT; BEGIN SELECT proj_det INTO v_proj_det FROM project WHERE proj_cd = i_proj_cd; RETURN v_proj_det; END; /
  • TRUNCATE TABLE Oracle中的TRUNCATE TABLE语句用于从表中删除所有记录,与DELETE语句功能相同,但不含WHERE子句。执行截断操作后,表将成为空表。DSC仅可迁移含有静态表名称的TRUNCATE TABLE语句,不支持迁移含有动态表名称的TRUNCATE TABLE语句。 该工具不支持迁移含有动态表名称的TRUNCATE TABLE语句。 例如:l_table :='truncate table ' || itable_name 在此示例中,itable_name表示动态表名称,不受DSC支持。不支持的语句将被原样复制到已迁移的脚本中。 输入:TRUNCATE TABLE,使用Execute Immediate 1 2 3 4 5 6 CREATE OR REPLACE PROCEDURE schema1.proc1 AS BEGIN EXECUTE IMMEDIATE 'TRUNCATE TABLE QUERY_TABLE'; End proc1; / 输出 1 2 3 4 5 CREATE OR REPLACE PROCEDURE schema1.proc1 AS BEGIN EXECUTE IMMEDIATE 'TRUNCATE TABLE schema1.QUERY_TABLE' ; end ; / 输入:在过程中使用TRUNCATE TABLE DSC不会为动态PL/SQL语句添加模式名称。 1 2 3 4 5 6 7 8 CREATE OR REPLACE PROCEDURE schemName.sp_dd_table ( itable_name VARCHAR2 ) IS l_table VARCHAR2 ( 255 ) ; BEGIN l_table :='truncate table ' || itable_name ; ---- dbms_utility.exec_ddl_statement(l_table); dbms_output.put_line ( itable_name || ' ' || 'Truncated' ) ; END sp_dd_table ; / 输出 1 2 3 4 5 6 7 8 9 CREATE OR REPLACE PROCEDURE schemName.sp_dd_table ( itable_name VARCHAR2 ) IS l_table VARCHAR2 ( 255 ) ; BEGIN l_table :='truncate table ' || itable_name ; /* dbms_utility.exec_ddl_statement(l_table); */ dbms_output.put_line ( itable_name || ' ' || 'Truncated' ) ; end ; /
  • EDITIONABLE GaussDB(DWS)不支持EDITIONABLE关键字,因此需要在目标数据库中删除。 输入:EDITIONABLE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE OR REPLACE EDITIONABLE PACKAGE "PACK1"."PACKAGE_SEND_MESSAGE" AS TYPE filelist IS REF CURSOR; PROCEDURE get_message_info (in_userid IN VARCHAR2, in_branchid IN VARCHAR2, in_appverid IN VARCHAR2, in_app_list_flag IN VARCHAR2, in_filetype IN VARCHAR2, in_filestate IN VARCHAR2, o_retcode OUT VARCHAR2, o_errormsg OUT VARCHAR2, o_seq OUT VARCHAR2, o_totalnum OUT NUMBER, o_filelist OUT filelist); 输出 1 2 3 4 /*~~PACKAGE_SEND_MESSAGE~~*/ CREATE SCHEMA PACKAGE_SEND_MESSAGE ;
共100000条