华为云用户手册

  • 使用示例 创建列存冷热数据管理表,指定热数据有效期LMT为100天。 1 2 3 4 5 6 7 8 CREATE TABLE lifecycle_table(i int, val text) WITH (ORIENTATION = COLUMN, storage_policy = 'LMT:100') PARTITION BY RANGE (i) ( PARTITION P1 VALUES LESS THAN(5), PARTITION P2 VALUES LESS THAN(10), PARTITION P3 VALUES LESS THAN(15), PARTITION P8 VALUES LESS THAN(MAXVALUE) )ENABLE ROW MOVEMENT; 切换冷数据至OBS表空间。 自动切换:每日0点调度框架自动触发,无需关注切换情况。 可自定义自动切换时间:根据业务情况调整自动触发时间,修改为每天早晨6点30分。 1 SELECT * FROM pg_obs_cold_refresh_time('lifecycle_table', '06:30:00'); 手动切换。 执行如下操作手动切换单表: 1 ALTER TABLE lifecycle_table refresh storage; 执行如下操作批量切换所有冷热表: 1 SELECT pg_catalog.pg_refresh_storage(); 将冷分区数据转换成热分区。该功能仅8.3.0及以上版本支持。 将冷热表的所有冷分区转换成热分区: 1 SELECT pg_catalog.reload_cold_partition('lifecycle_table'); 将冷热表的指定冷分区转换成热分区: 1 SELECT pg_catalog.reload_cold_partition('lifecycle_table', 'cold_partition_name'); 查看冷热表数据分布情况。 查看单表数据分布情况: 1 SELECT * FROM pg_catalog.pg_lifecycle_table_data_distribute('lifecycle_table'); 查看所有冷热表数据分布情况: 1 SELECT * FROM pg_catalog.pg_lifecycle_node_data_distribute();
  • 冷热数据管理的约束限制 目前冷热表只支持列存2.0版本的分区表,外表不支持冷热分区。 对于已经切冷分区再次插入数据,数据直接会进入OBS,不会改变分区的冷热属性。 对于同一分区在同一DN只会存在冷或热的一种情况,对于同一分区在不同DN可能存在部分DN为热数据,部分DN为冷数据。 对于同时存在冷热分区的表,查询时会变慢,因为冷数据存储在OBS上,读写速度和时延都比在本地查询要慢。 只支持修改冷热表的冷热切换策略,不支持修改冷热表的冷数据的表空间。 冷热表的分区操作约束: 不支持对冷分区的数据进行exchange操作。 Merge partition分区只支持热分区和热分区合并、冷分区和冷分区合并,不支持冷热分区合并。 ADD/Merge/Split Partition等分区操作不支持指定表空间为OBS表空间。 不支持创建时指定和修改冷热表分区的表空间。 冷热切换不是只要满足条件就立刻进行冷热数据切换,依赖用户手动调用切换命令,或者通过调度器调用切换命令后才真正进行数据切换。目前自动调度时间为每日0点,可进行修改。 目前冷热切换规则只支持LMT和HPN两种。 冷热数据表不支持物理细粒度备份和恢复,由于物理备份时只备份热数据,在备份恢复前后OBS上冷数据为同一份,不支持truncate和drop table等涉及删除文件操作语句的备份恢复操作。
  • 冷热数据简介 海量大数据场景下,随着业务和数据量的不断增长,数据存储与消耗的资源也日益增长。根据业务系统中用户对不同时期数据的不同使用需求,对膨胀的数据本身进行“冷热”分级管理,不仅可以提高数据分析性能还能降低业务成本。 例如,在网络流量分析系统中,用户可能对最近一个月内安全事件和网络访问情况感兴趣,而很少关注几个月前的数据。针对这样的一些场景,可以将数据按照时间分为:热数据、冷数据。 冷热数据主要从数据访问频率、更新频率进行划分。 Hot(热数据):访问、更新频率较高,未来被调用的概率较高的数据,对访问的响应时间要求很高的数据。 Cold(冷数据):不允许更新或更新频率比较低,访问频率比较低,对访问的响应时间要求不高的数据。 用户可以定义冷热管理表,将符合规则的冷数据切换至OBS上进行存储,可以按照分区自动进行冷热数据的判断和迁移。
  • 冷热数据管理支持功能 支持对冷热表的insert、copy、delete、update、select等表相关的DML操作。 支持对冷热表的权限管理等DCL操作。 支持对冷热表进行analyze、vacuum、merge into等操作和一些分区的操作。 支持从普通列存分区表升级为冷热数据表。 支持带有冷热数据管理表的升级、扩容、缩容和重分布。 支持冷热分区互相转换。该功能仅8.3.0及以上版本支持。
  • DELAYED DELAYED插入和替换在MySQL 5.6中被弃用。在MySQL 5.7中,DELAYED 不支持。服务器识别但忽略DELAYED关键字,将替换处理为非延迟替换,并生成ER_WARN_LEGACY_SYNTAX_CONVERTED警告。(REPLACE DELAYED不再被支持,语句被转换为REPLACE。 )DELAYED 关键字将在未来版本中被删除。 输入 1 2 3 4 5 6 7 8 9 #DELAYED INSERT DELAYED works only with MyISAM, MEMORY, ARCHIVE, and BLACKHOLE tables. #If you execute INSERT DELAYED with another storage engine, #you will get an error like this: ERROR 1616 (HY000): DELAYED option not supported Replace DELAYED INTO exmp_tb2 VALUES(10, 128.23, 'nice', '2018-10-11 19:00:00'); Replace DELAYED INTO exmp_tb2 VALUES(6, DEFAULT, 'nice', '2018-12-14 19:00:00'); Replace DELAYED INTO exmp_tb2 VALUES(7, 20, 'nice', DEFAULT); Replace DELAYED INTO exmp_tb2 (tb2_id, tb2_price) VALUES(11, DEFAULT); Replace DELAYED INTO exmp_tb2 (tb2_id, tb2_price, tb2_note) VALUES(12, DEFAULT, DEFAULT); Replace DELAYED INTO exmp_tb2 (tb2_id, tb2_price, tb2_note, tb2_date) VALUES(13, DEFAULT, DEFAULT, DEFAULT); 输出 1 2 3 4 5 6 7 8 9 --DELAYED INSERT DELAYED works only with MyISAM, MEMORY, ARCHIVE, and BLACKHOLE tables. --If you execute INSERT DELAYED with another storage engine, --you will get an error like this: ERROR 1616 (HY000): DELAYED option not supported. INSERT INTO "public"."exmp_tb2" VALUES (10,128.23,'nice','2018-10-11 19:00:00'); INSERT INTO "public"."exmp_tb2" VALUES (6,DEFAULT,'nice','2018-12-14 19:00:00'); INSERT INTO "public"."exmp_tb2" VALUES (7,20,'nice',DEFAULT); INSERT INTO "public"."exmp_tb2" ("tb2_id","tb2_price") VALUES (11,DEFAULT); INSERT INTO "public"."exmp_tb2" ("tb2_id","tb2_price","tb2_note") VALUES (12,DEFAULT,DEFAULT); INSERT INTO "public"."exmp_tb2" ("tb2_id","tb2_price","tb2_note","tb2_date") VALUES (13,DEFAULT,DEFAULT,DEFAULT); 父主题: REPLACE
  • 连接参数 【关注】第三方工具通过JDBC连接GaussDB(DWS)时,JDBC向GaussDB(DWS)发起连接请求,会默认添加以下配置参数,详见JDBC代码ConnectionFactoryImpl类的实现。 params = { { "user", user }, { "database", database }, { "client_encoding", "UTF8" }, { "DateStyle", "ISO" }, { "extra_float_digits", "2" }, { "TimeZone", createPostgresTimeZone() }, }; 这些参数可能会导致JDBC客户端的行为与gsql客户端的行为不一致,例如,Date数据显示方式、浮点数精度表示、timezone显示。 如果实际期望和这些配置不符,建议在java连接设置代码中显式设定这些参数。 【建议】通过JDBC连接数据库时,应该保证下面两个时区设置一致: JDBC客户端所在主机的时区。 GaussDB(DWS)集群所在主机的时区。
  • 释放连接 【建议】推荐使用连接池限制应用程序的连接数。每执行一条SQL就连接一次数据库,是一种不好SQL的编写习惯。 【建议】在应用程序完成作业任务之后,应当及时断开和GaussDB(DWS)的连接,释放资源。建议在任务中设置session超时时间参数。 【建议】使用JDBC连接池,在将连接释放给连接池前,需要执行以下操作重置会话环境。否则,可能会因为历史会话信息导致的对象冲突。 如果在连接中设置了GUC参数,那么在将连接归还连接池之前,必须执行“SET SESSION AUTHORIZATION DEFAULT;RESET ALL;”将连接的状态清空。 如果使用了临时表,那么在将连接归还连接池之前,必须将临时表删除。
  • 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_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 ; 输出 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语法迁移
  • 环境变量 表5 与gsql相关的环境变量 名称 描述 COLUMNS 如果\set columns为0,则由此参数控制wrapped格式的宽度。这个宽度用于决定在自动扩展的模式下,是否要把宽输出模式变成竖线的格式。 PAGER 如果查询结果无法在一页显示,它们就会被重定向到这个命令。可以用\pset命令关闭分页器。典型的是用命令more或less来实现逐页查看。缺省值是平台相关的。 说明: less的文本显示,受系统环境变量LC_CTYPE影响。 PSQL_EDITOR \e和\ef命令使用环境变量指定的编辑器。变量是按照列出的先后顺序检查的。在Unix系统上默认的编辑工具是vi。 EDITOR VISUAL PSQL_EDITOR_LINENUMBER_ARG 当\e和\ef带上一行数字参数使用时,这个变量指定的命令行参数用于向编辑器传递起始行数。像Emacs或vi这样的编辑器,这只是个加号。如果选项和行号之间需要空白,在变量的值后加一个空格。例如: PSQL_EDITOR_LINENUMBER_ARG = '+' PSQL_EDITOR_LINENUMBER_ARG='--line ' Unix系统默认的是+。 PSQLRC 用户的.gsqlrc文件的交互位置。 SHELL 使用\!命令跟shell执行的命令是一样的效果。 TMPDIR 存储临时文件的目录。缺省是/tmp。
  • 基本功能 连接数据库: 通过gsql客户端远程连接GaussDB(DWS)数据库。 gsql创建连接时,会有5分钟超时时间。如果在这个时间内,数据库未正确地接受连接并对身份进行认证,gsql将超时退出。 针对此问题,可以参考常见问题处理。 执行SQL语句:支持交互式地键入并执行SQL语句,也可以执行一个文件中指定的SQL语句。 执行元命令:元命令可以帮助管理员查看数据库对象的信息、查询缓存区信息、格式化SQL输出结果,以及连接到新的数据库等。元命令的详细说明请参见元命令参考。
  • checkpoint_segments 参数说明:设置checkpoint_timeout周期内所保留的最少WAL日志段文件数量。每个日志文件大小为16MB。 参数类型:SIGHUP 取值范围:整型,最小值1 默认值:64 提升此参数可加快大数据的导入速度,但需要结合checkpoint_timeout、shared_buffers这两个参数统一考虑。这个参数同时影响WAL日志段文件复用数量,通常情况下pg_xlog文件夹下最大的复用文件个数为2倍的checkpoint_segments个,复用的文件被改名为后续即将使用的WAL日志段文件,不会被真正删除。
  • ALTER TABLE RENAME GaussDB(DWS)不支持rename子句包含schema名,因此DSC工具只支持同schema下的rename。同schema下rename,转换结果去掉子句schema,跨schema的rename报错。 输入示例 1 2 3 4 ALTER TABLE `shce1`.`t1` rename to `t2`; ALTER TABLE `shce1`.`t1` rename to t2; ALTER TABLE `charge_data`.`group_shengfen2022` RENAME `charge_data`.`group_shengfen2022_jiu`; ALTER TABLE `charge_data`.`group_shengfen2022` RENAME `charge_data`.`group_shengfen2022_jiu`, RENAME `charge_data`.`group_shengfen2023_jiu`, RENAME `charge_data`.`group_shengfen2024_jiu`; 输出示例 1 2 3 4 ALTER TABLE "shce1"."t1" RENAME TO "t2"; ALTER TABLE "shce1"."t1" RENAME TO "t2"; ALTER TABLE "charge_data"."group_shengfen2022" RENAME TO "group_shengfen2022_jiu"; ALTER TABLE "charge_data"."group_shengfen2022" RENAME TO "group_shengfen2022_jiu", RENAME TO "group_shengfen2023_jiu", RENAME TO "group_shengfen2024_jiu"; 父主题: 表(可选参数、操作)
  • JDBC接口参考 JDBC接口是一套提供给用户的API方法,本节将对部分常用接口做具体描述,若涉及其他接口可参考JDK1.6(软件包)/JDBC4.0中相关内容。 java.sql.Connection java.sql.CallableStatement java.sql.DatabaseMetaData java.sql.Driver java.sql.PreparedStatement java.sql.ResultSet java.sql.ResultSetMetaData java.sql.Statement javax.sql.ConnectionPoolDataSource javax.sql.DataSource javax.sql.PooledConnection javax.naming.Context javax.naming.spi.InitialContextFactory CopyManager 父主题: 基于JDBC开发
  • MONTHS_BETWEEN MONTHS_BETWEEN函数返回两个日期之间的月份数。 MONTHS_BETWEEN是Oracle系统函数,GaussDB(DWS)并不隐式支持该函数。要支持此函数,DSC需在MIG_ORA_EXT模式中创建一个MONTHS_BETWEEN函数。迁移后的语句将使用此新函数MIG_ORA_EXT.MONTHS_BETWEEN,如下所示。 在使用此函数之前,请执行如下操作: 创建并使用MIG_ORA_EXT模式。 复制custom scripts文件中的内容,并在要执行迁移的所有目标数据库中执行此脚本。详情请参见迁移流程。 输入:MONTHS_BETWEEN Select Months_Between(to_date('2017-06-20', 'YYYY-MM-DD'), to_date('2011-06-20', 'YYYY-MM-DD')) from dual; 输出 Select MIG_ORA_EXT.MONTHS_BETWEEN(to_date('2017-06-20', 'YYYY-MM-DD'), to_date('2011-06-20', 'YYYY-MM-DD')) from dual;
  • ADD_MONTHS ADD_MONTHS是Oracle系统函数,GaussDB(DWS)中并不隐式支持该函数。 在使用此函数之前,请执行如下操作: 创建并使用MIG_ORA_EXT模式。 复制custom scripts文件的内容,并在要执行迁移的所有目标数据库中执行此脚本。详情请参见迁移流程。 ADD_MONTHS返回带月份的日期。 date参数为datetime类型。 integer参数为integer类型。 返回类型为date。 输入:ADD_MONTHS 1 2 3 4 5 6 7 SELECT TO_CHAR( ADD_MONTHS ( hire_date ,1 ) ,'DD-MON-YYYY' ) "Next month" FROM employees WHERE last_name = 'Baer' ; 输出 1 2 3 4 5 6 7 SELECT TO_CHAR( MIG_ORA_EXT.ADD_MONTHS ( hire_date ,1 ) ,'DD-MON-YYYY' ) "Next month" FROM employees WHERE last_name = 'Baer' ;
  • LAST_DAY Oracle的LAST_DAY函数根据date(日期)值返回该月份的最后一天。 LAST_DAY(date) 不论date的数据类型如何,返回类型始终为DATE。 LAST_DAY是Oracle的系统函数,GaussDB(DWS)不隐式支持该函数。要支持此函数,DSC会在MIG_ORA_EXT模式中创建一个LAST_DAY函数。迁移后的语句将使用此新函数MIG_ORA_EXT.LAST_DAY,如下示例。 在使用此函数之前,请执行如下操作: 创建并使用MIG_ORA_EXT模式。 复制custom scripts文件的内容,并在要执行迁移的所有目标数据库中执行此脚本。详情请参见迁移流程。 输入:LAST_DAY 1 2 3 4 5 SELECT to_date( '01/' || '07/' || to_char( sysdate ,'YYYY' ) ,'dd/mm/yyyy' ) FIRST ,last_day( to_date( '01/' || '07/' || to_char( sysdate ,'YYYY' ) ,'dd/mm/yyyy' ) ) last__day FROM dual; 输出 1 2 3 4 5 6 7 SELECT to_date( '01/' || '07/' || to_char( sysdate ,'YYYY' ) ,'dd/mm/yyyy' ) FIRST ,MIG_ORA_EXT.LAST_DAY ( to_date( '01/' || '07/' || to_char( sysdate ,'YYYY' ) ,'dd/mm/yyyy' ) ) last__day FROM dual;
  • 下载客户端 表1 gsql下载地址 操作系统类别 适用操作系统版本 下载地址 校验文件 Microsoft Windows Microsoft Windows x86_64: Windows 7及以上。 Windows Server 2008及以上。 dws_8.1.x_gsql_for_windows.zip dws_8.1.x_gsql_for_windows.zip.sha256 dws_8.2.x_gsql_for_windows.zip dws_8.2.x_gsql_for_windows.zip.sha256 Redhat x86_64 RHEL 6.4~7.6 dws_client_8.2.x_redhat_x64.zip dws_client_8.2.x_redhat_x64.zip.sha256 dws_client_8.1.x_redhat_x64.zip dws_client_8.1.x_redhat_x64.zip.sha256 dws_client_8.0.x_redhat_x64.zip dws_client_8.0.x_redhat_x64.zip.sha256 SUSE x86_64 SLES 11.1~11.4,SLES 12.0~12.3 dws_client_8.2.x_suse_x64.zip dws_client_8.2.x_suse_x64.zip.sha256 dws_client_8.1.x_suse_x64.zip dws_client_8.1.x_suse_x64.zip.sha256 dws_client_8.0.x_suse_x64.zip dws_client_8.0.x_suse_x64.zip.sha256 Euler Kunpeng_64 EulerOS 2.0 SP8 dws_client_8.1.x_euler_kunpeng_x64.zip dws_client_8.1.x_euler_kunpeng_x64.zip.sha256 Redhat Kunpeng_64 CentOS-7.6-aarch64和NeoKylin-7.6-aarch64 (适配鲲鹏920处理器) dws_client_8.1.x_redhat_kunpeng_x64.zip dws_client_8.1.x_redhat_kunpeng_x64.zip.sha256
  • dbc.columnsV和dbc.IndicesV 输入 输出 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 SELECT A.ColumnName AS V_COLS ,A.columnname || ' ' ||CASE WHEN columnType in ('CF','CV') THEN CASE WHEN columnType='CV' THEN 'VAR' ELSE '' END||'CHAR('||TRIM(columnlength (INT))|| ') CHARACTER SET LATIN'|| CASE WHEN UpperCaseFlag='N' THEN ' NOT' ELSE '' END || ' CASESPECIFIC' WHEN columnType='DA' THEN 'DATE' WHEN columnType='TS' THEN 'TIMESTAMP(' || TRIM(DecimalFractionalDigits)||')' WHEN columnType='AT' THEN 'TIME('|| TRIM(DecimalFractionalDigits)||')' WHEN columnType='I' THEN 'INTEGER' WHEN columnType='I1' THEN 'BYTEINT' WHEN columnType='I2' THEN 'SMALLINT' WHEN columnType='I8' THEN 'BIGINT' WHEN columnType='D' THEN 'DECIMAL('||TRIM(DecimalTotalDigits)||','||TRIM(DecimalFractionalDigits)||')' ELSE 'Unknown' END||CASE WHEN Nullable='Y' THEN '' ELSE ' NOT NULL' END||'0A'XC AS V_ColT - ,B.ColumnName AS V_PICol --获得目标表主索引 FROM dbc.columnsV A LEFT JOIN dbc.IndicesV B ON A.columnName = B.columnName AND B.IndexType IN ('Q','P') AND B.DatabaseName = '${V_TDDLDB}' AND B.tablename='${TARGET_TABLE}' WHERE A.databasename='${V_TDDLDB}' AND A.tablename = '${TARGET_TABLE}' AND A.columnname NOT IN ( 'ETL_JOB_NAME' ,'ETL_TX_DATE' ,'ETL_PROC_DATE' ) ORDER BY A.columnid; 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 DECLARE lv_mig_V_COLS TEXT; lv_mig_V_ColT TEXT; lv_mig_V_PICol TEXT; BEGIN SELECT STRING_AGG(A.ColumnName, ',') , STRING_AGG(A.columnname || ' ' ||CASE WHEN columnType in ('CF','CV') THEN CASE WHEN columnType='CV' THEN 'VAR' ELSE '' END||'CHAR('||TRIM(mig_td_ext.mig_fn_castasint(columnlength))|| ') /*CHARACTER SET LATIN*/'|| CASE WHEN UpperCaseFlag='N' THEN ' NOT' ELSE '' END || ' /*CASESPECIFIC*/' WHEN columnType='DA' THEN 'DATE' WHEN columnType='TS' THEN 'TIMESTAMP(' || TRIM(DecimalFractionalDigits)||')' WHEN columnType='AT' THEN 'TIME('|| TRIM(DecimalFractionalDigits)||')' WHEN columnType='I' THEN 'INTEGER' WHEN columnType='I1' THEN 'BYTEINT' WHEN columnType='I2' THEN 'SMALLINT' WHEN columnType='I8' THEN 'BIGINT' WHEN columnType='D' THEN 'DECIMAL('||TRIM(DecimalTotalDigits)||','||TRIM(DecimalFractionalDigits)||')' ELSE 'Unknown' END||CASE WHEN Nullable='Y' THEN '' ELSE ' NOT NULL' END||E'\x0A', ',') , STRING_AGG(B.ColumnName, ',') INTO lv_mig_V_COLS, lv_mig_V_ColT, lv_mig_V_PICol FROM mig_td_ext.vw_td_dbc_columnsV A LEFT JOIN mig_td_ext.vw_td_dbc_IndicesV B ON A.columnName = B.columnName AND B.IndexType IN ('Q','P') AND B.DatabaseName = 'public' AND B.tablename='emp2' WHERE A.databasename='public' AND A.tablename = 'emp2'; -- ORDER BY A.columnid; END; /
  • java.sql.DatabaseMetaData java.sql.DatabaseMetaData是数据库对象定义接口。 表1 对java.sql.DatabaseMetaData的支持情况 方法名 返回值类型 支持JDBC 4 getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types) ResultSet Yes getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) ResultSet Yes getTableTypes() ResultSet Yes getUserName() String Yes isReadOnly() boolean Yes nullsAreSortedHigh() boolean Yes nullsAreSortedLow() boolean Yes nullsAreSortedAtStart() boolean Yes nullsAreSortedAtEnd() boolean Yes getDatabaseProductName() String Yes getDatabaseProductVersion() String Yes getDriverName() String Yes getDriverVersion() String Yes getDriverMajorVersion() int Yes getDriverMinorVersion() int Yes usesLocalFiles() boolean Yes usesLocalFilePerTable() boolean Yes supportsMixedCaseIdentifiers() boolean Yes storesUpperCaseIdentifiers() boolean Yes storesLowerCaseIdentifiers() boolean Yes supportsMixedCaseQuotedIdentifiers() boolean Yes storesUpperCaseQuotedIdentifiers() boolean Yes storesLowerCaseQuotedIdentifiers() boolean Yes storesMixedCaseQuotedIdentifiers() boolean Yes supportsAlterTableWithAddColumn() boolean Yes supportsAlterTableWithDropColumn() boolean Yes supportsColumnAliasing() boolean Yes nullPlusNonNullIsNull() boolean Yes supportsConvert() boolean Yes supportsConvert(int fromType, int toType) boolean Yes supportsTableCorrelationNames() boolean Yes supportsDifferentTableCorrelationNames() boolean Yes supportsExpressionsInOrderBy() boolean Yes supportsOrderByUnrelated() boolean Yes supportsGroupBy() boolean Yes supportsGroupByUnrelated() boolean Yes supportsGroupByBeyondSelect() boolean Yes supportsLikeEscapeClause() boolean Yes supportsMultipleResultSets() boolean Yes supportsMultipleTransactions() boolean Yes supportsNonNullableColumns() boolean Yes supportsMinimumSQLGrammar() boolean Yes supportsCoreSQLGrammar() boolean Yes supportsExtendedSQLGrammar() boolean Yes supportsANSI92EntryLevelSQL() boolean Yes supportsANSI92IntermediateSQL() boolean Yes supportsANSI92FullSQL() boolean Yes supportsIntegrityEnhancementFacility() boolean Yes supportsOuterJoins() boolean Yes supportsFullOuterJoins() boolean Yes supportsLimitedOuterJoins() boolean Yes isCatalogAtStart() boolean Yes supportsSchemasInDataManipulation() boolean Yes supportsSavepoints() boolean Yes supportsResultSetHoldability(int holdability) boolean Yes getResultSetHoldability() int Yes getDatabaseMajorVersion() int Yes getDatabaseMinorVersion() int Yes getJDBCMajorVersion() int Yes getJDBCMinorVersion() int Yes 父主题: JDBC接口参考
  • 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); 父主题: 表(可选参数、操作)
  • 在结果集中定位 ResultSet对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next方法将光标移动到下一行;因为该方法在ResultSet对象没有下一行时返回false,所以可以在while循环中使用它来迭代结果集。但对于可滚动的结果集,JDBC驱动程序提供更多的定位方法,使ResultSet指向特定的行。定位方法如表2所示。 表2 在结果集中定位的方法 方法 描述 next() 把ResultSet向下移动一行。 previous() 把ResultSet向上移动一行。 beforeFirst() 把ResultSet定位到第一行之前。 afterLast() 把ResultSet定位到最后一行之后。 first() 把ResultSet定位到第一行。 last() 把ResultSet定位到最后一行。 absolute(int) 把ResultSet移动到参数指定的行数。 relative(int) 向前或者向后移动参数指定的行。
  • 设置结果集类型 不同类型的结果集有各自的应用场景,应用程序需要根据实际情况选择相应的结果集类型。在执行SQL语句过程中,都需要先创建相应的语句对象,而部分创建语句对象的方法提供了设置结果集类型的功能。具体的参数设置如表1所示。涉及的Connection的方法如下: 1 2 3 4 5 6 7 8 //创建一个Statement对象,该对象将生成具有给定类型和并发性的ResultSet对象。 createStatement(int resultSetType, int resultSetConcurrency); //创建一个PreparedStatement对象,该对象将生成具有给定类型和并发性的ResultSet对象。 prepareStatement(String sql, int resultSetType, int resultSetConcurrency); //创建一个CallableStatement对象,该对象将生成具有给定类型和并发性的ResultSet对象。 prepareCall(String sql, int resultSetType, int resultSetConcurrency); 表1 结果集类型 参数 描述 resultSetType 表示结果集的类型,具体有三种类型: ResultSet.TYPE_FORWARD_ONLY:ResultSet只能向前移动。是缺省值。 ResultSet.TYPE_SCROLL_SENSITIVE:在修改后重新滚动到修改所在行,可以看到修改后的结果。 ResultSet.TYPE_SCROLL_INSENSITIVE:对可修改例程所做的编辑不进行显示。 说明: 结果集从数据库中读取了数据之后,即使类型是ResultSet.TYPE_SCROLL_SENSITIVE,也不会看到由其他事务在这之后引起的改变。调用ResultSet的refreshRow()方法,可进入数据库并从其中取得当前游标所指记录的最新数据。 resultSetConcurrency 表示结果集的并发,具体有两种类型: ResultSet.CONCUR_READ_ONLY:如果不从结果集中的数据建立一个新的更新语句,不能对结果集中的数据进行更新。 ResultSet.CONCUR_UPDATEABLE:可改变的结果集。对于可滚动的结果集,可对结果集进行适当的改变。
  • 获取结果集中的数据 ResultSet对象提供了丰富的方法,以获取结果集中的数据。获取数据常用的方法如表4所示,其他方法请参考JDK官方文档。 表4 ResultSet对象的常用方法 方法 描述 int getInt(int columnIndex) 按列标获取int型数据。 int getInt(String columnLabel) 按列名获取int型数据。 String getString(int columnIndex) 按列标获取String型数据。 String getString(String columnLabel) 按列名获取String型数据。 Date getDate(int columnIndex) 按列标获取Date型数据 Date getDate(String columnLabel) 按列名获取Date型数据。
  • 获取结果集中光标的位置 对于可滚动的结果集,可能会调用定位方法来改变光标的位置。JDBC驱动程序提供了获取结果集中光标所处位置的方法。获取光标位置的方法如表3所示。 表3 获取结果集光标的位置 方法 描述 isFirst() 是否在一行。 isLast() 是否在最后一行。 isBeforeFirst() 是否在第一行之前。 isAfterLast() 是否在最后一行之后。 getRow() 获取当前在第几行。
  • 日志概述 日志文件是DSC所有操作和状态的存储库。支持以下日志文件: SQL迁移日志 DSC.log:SQL迁移的所有活动。 DSCError.log:SQL迁移错误。 successRead.log:SQL迁移中对输入文件的成功读次数。 successWrite.log:SQL迁移中对输入文件的成功写次数。 Perl迁移日志 perlDSC.log:Perl迁移中所有的活动、预警和错误。 Apache Log4j用于指定DSC记录日志的框架。用户可使用以下Log4j配置文件,也可以根据需要进行自定义: Teradata/Oracle/Netezza/DB2 : config/log4j2.xml MySQL : config/log4j2_mysql.xml 父主题: 日志参考
  • SQL历史记录 历史执行SQL脚本未加密。 “历史执行SQL”列表不显示包含如下关键字的敏感查询: Alter Role Alter User Create Role Create User Identified by Password 部分查询语法示例列举如下: ALTER USER name [ WITH ] option [ ... ]] CREATE USER name [ [ WITH ] option [ ... ] ] CREATE ROLE name [ [ WITH ] option [ ... ] ] ALTER ROLE name [ [ WITH ] option [ ... ] ]
共100000条