华为云用户手册

  • 连接参数 【关注】第三方工具通过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_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语法迁移
  • 环境变量 表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); 父主题: 表(可选参数、操作)
  • 设置结果集类型 不同类型的结果集有各自的应用场景,应用程序需要根据实际情况选择相应的结果集类型。在执行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型数据。
  • 在结果集中定位 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) 向前或者向后移动参数指定的行。
  • 获取结果集中光标的位置 对于可滚动的结果集,可能会调用定位方法来改变光标的位置。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 [ ... ] ]
  • 应用示例 查询分区表web_returns_p2的分区信息。 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 CREATE TABLE web_returns_p2 ( wr_returned_date_sk integer, wr_returned_time_sk integer, wr_item_sk integer NOT NULL, wr_refunded_customer_sk integer ) WITH (orientation = column) DISTRIBUTE BY HASH (wr_item_sk) PARTITION BY RANGE(wr_returned_date_sk) ( PARTITION p2016 START(20161231) END(20191231) EVERY(10000), PARTITION p0 END(maxvalue) ); SELECT oid FROM pg_class WHERE relname ='web_returns_p2'; oid ------- 97628 SELECT relname,parttype,parentid,boundaries FROM pg_partition WHERE parentid = '97628'; relname | parttype | parentid | boundaries ----------------+----------+----------+------------ web_returns_p2 | r | 97628 | p2016_0 | p | 97628 | {20161231} p2016_1 | p | 97628 | {20171231} p2016_2 | p | 97628 | {20181231} p2016_3 | p | 97628 | {20191231} p0 | p | 97628 | {NULL} (6 rows)
  • 行列存压缩 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"); 父主题: 表(可选参数、操作)
  • Hudi简介 Apache Hudi(发音Hoodie)表示Hadoop Upserts Deletes and Incrementals。用来管理Hadoop大数据体系下存储在DFS上大型分析数据集。 Hudi不是单纯的数据格式,而是一套数据访问方法(类似GaussDB(DWS)存储的access层),在Apache Hudi 0.9版本,大数据的Spark,Flink等组件都单独实现各自客户端。Hudi的逻辑存储如下图所示: 写入模式 COW:写时复制,适合更新少的场景。 MOR:读时复制,对于UPDATE&DELETE增量写delta log文件,分析时进行base和delta log文件合并,异步compaction合并文件。 存储格式 index:对主键进行索引,默认是file group级别的bloomfilter。 data files:base file + delta log file(主要面向对base file的update&delete)。 timeline metadata:版本log的管理。 视图 读优化视图:读取Compaction后生成的base file,未Compaction数据时效性有一定延迟(高效读取)。 实时视图:读取最新的数据,在读取时进行Base file和Delta file合并(频繁update场景)。 增量视图:类似CDC方式持续读取增量写入Hudi的数据(流批一体)。 父主题: SQL on Hudi
  • 创建用户/角色 多个用户可以使用同一数据库,为了方便管理,需要将用户进行分组。一个数据库角色代表一个或一组数据库用户。 在数据库中,用户和角色的概念类似。实际应用中,建议使用角色来进行权限管理而不是直接访问数据库。 用户:数据库用户的集合。这些用户与操作系统用户不同,可以为其他用户分配权限以访问数据库对象。 角色:根据用途的不同,可以将角色分为用户或用户组。角色是集群级别的定义,适用于集群中的所有数据库。
  • 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;
共100000条