华为云用户手册

  • (可选)准备E CS 作为gsql客户端主机 购买弹性云服务器的操作步骤,请参见《弹性云服务器快速入门》中的购买并登录Linux弹性云服务器章节。 创建的弹性云服务器需要满足如下要求: 弹性云服务器需要与 GaussDB (DWS) 集群具有相同的区域、可用区。 如果使用GaussDB(DWS) 提供的gsql命令行客户端连接GaussDB(DWS) 集群,弹性云服务器的镜像必须满足如下要求: 镜像的操作系统必须是gsql客户端所支持的下列Linux操作系统: “Redhat x86_64”客户端工具支持在以下系统中使用: RHEL 6.4~7.6。 CentOS 6.4~7.4。 EulerOS 2.3。 “SUSE x86_64”客户端工具支持在以下系统中使用: SLES 11.1~11.4。 SLES 12.0~12.3。 “Euler Kunpeng_64”客户端工具支持在以下系统中使用: EulerOS 2.8。 “Stream Euler X86_64”客户端工具支持在以下系统中使用: EulerOS 2.2。 “Stream Euler Kunpeng_64”客户端工具支持在以下系统中使用: EulerOS 2.8。 如果客户端通过内网地址访问集群,请确保创建的弹性云服务器与GaussDB(DWS) 集群在同一虚拟私有云里。 虚拟私有云相关操作请参见《虚拟私有云用户指南》中虚拟私有云和子网章节。 如果客户端通过公网地址访问集群,请确保创建的弹性云服务器和GaussDB(DWS) 集群都要有弹性IP。 购买弹性云服务器时,参数“弹性公网IP”需选择“现在购买”或“使用已有”。 弹性云服务器对应的安全组规则需要确保能与GaussDB(DWS) 集群提供服务的端口网络互通。 安全组相关操作请参见《虚拟私有云用户指南》中安全组章节。 请确认弹性云服务器的安全组中存在符合如下要求的规则,如果不存在,请在弹性云服务器的安全组中添加相应的规则: 方向:出方向 协议:必须包含TCP,例如TCP、全部。 端口:需要包含GaussDB(DWS) 集群提供服务的数据库端口,例如,设置为“1-65535”或者具体的GaussDB(DWS) 数据库端口。 目的地址:设置的IP地址需要包含所要连接的GaussDB(DWS) 集群的连接地址。其中0.0.0.0/0表示任意地址。 图1 出方向的规则 GaussDB(DWS) 集群的安全组规则需要确保GaussDB(DWS) 能接收来自客户端的网络访问。 请确认GaussDB(DWS) 集群的安全组中存在符合如下要求的规则,如果不存在,请在GaussDB(DWS) 集群的安全组中添加相应的规则。 方向:入方向 协议:必须包含TCP,例如TCP、全部。 端口:设置为GaussDB(DWS) 集群提供服务的数据库端口,例如“8000”。 源地址:设置的IP地址需要包含GaussDB(DWS) 客户端主机的IP地址,例如“192.168.0.10/32”。 图2 入方向的规则
  • 示例 启动gds。 python3 gds_ctl.py start 停止由配置文件启动的gds。 python3 gds_ctl.py stop 停止所有当前用户有权限关闭的gds。 python3 gds_ctl.py stop all 停止当前用户有权限关闭的,由[ip:]port指定的gds。 python3 gds_ctl.py stop 127.0.0.1:8098 查询gds状态。 python3 gds_ctl.py status
  • pg_last_xact_replay_timestamp() 描述:获取最后一个事务在恢复时重放的时间戳。这是为在主节点上生成事务提交或终止WAL记录的时间。如果在恢复时没有事务重放,则这个函数返回NULL。否则,如果恢复仍在进行,则事务日志将持续递增。如果恢复已经完成,则将保持在恢复期间最后接收WAL记录的值。如果服务器无需恢复就已正常启动,则这个函数返回NULL。 返回值类型:timestamp with time zone 恢复控制函数控制恢复的进程。这些函数可能只在恢复时被执行。 示例: 1 2 3 4 5 SELECT pg_last_xact_replay_timestamp(); pg_last_xact_replay_timestamp ------------------------------- 2023-01-04 07:03:08.098024+00 (1 row)
  • 参数说明 start 启动gds.conf中配置的gds。 stop 关闭当前用户有权限关闭的经配置文件启动的gds运行实例。 stop all 关闭当前用户有权限关闭的所有gds运行实例。 stop [ ip: ] port 关闭当前用户有权限关闭的特定gds运行实例。如果启动时指定了ip:port,那么停止需要指定相应的ip:port;如果启动时未指定IP,只指定port,则停止只需指定相应的port即可。如启动和停止指定不同的信息,则停止失败。 status 查询通过gds.conf启动的gds实例的运行状态。
  • pg_last_xlog_replay_location() 描述:获取最后一个事务日志在恢复时重放的位置。如果恢复仍在进行,事务日志将持续递增。如果已经完成恢复,则将保持在恢复期间最后接收WAL记录的值。如果未进行恢复但服务器正常启动时,则这个函数返回NULL。 返回值类型:text 示例: 1 2 3 4 5 SELECT pg_last_xlog_replay_location(); pg_last_xlog_replay_location ------------------------------ 0/2B16530 (1 row)
  • pg_last_xlog_receive_location() 描述:获取最后接收事务日志的位置并通过流媒体复制同步到磁盘。在流复制仍在进行,事务日志将持续递增。如果恢复已完成,则这个值将保持最后接收事务记录的状态并在恢复期间同步到磁盘。如果不能用流复制,或还没有开始,这个函数返回NULL。 返回值类型:text 示例: 1 2 3 4 5 SELECT pg_last_xlog_receive_location(); pg_last_xlog_receive_location ------------------------------- (1 row)
  • pg_xlog_replay_resume() 描述:如果恢复处于暂停状态,则重新启动。 当恢复暂停时,没有发生数据库更改。如果是在热备里,所有新的查询将看到一致的数据库快照,并且不会有进一步的查询冲突产生,直到恢复继续。 如果不能使用流复制,则暂停状态将无限的延续。当流复制正在进行时,将连续接收WAL记录,最终将填满可用磁盘空间,这个进度取决于暂停的持续时间,WAL生成的速度和可用的磁盘空间。 返回值类型:void
  • pg_xlog_replay_completion() 描述:显示当前DN上xlog redo的进度信息。 返回值类型:record 示例: 1 2 3 4 5 SELECT * FROM pg_xlog_replay_completion(); replay_start | replay_current | replay_end | replay_percent --------------+----------------+------------+---------------- 0/2ACAB80 | 0/2B16530 | 0/4F62B090 | 0% (1 row) 函数返回信息如下: 表1 pg_xlog_replay_completion()字段 名称 类型 描述 replay_start integer Xlog Redo的起始LSN replay_current integer Xlog Redo的当前replay的LSN replay_end integer 最大的需要Xlog Redo的LSN replay_percent integer Xlog Redo的当前完成的百分比
  • pg_data_sync_from_dummy_completion() 描述:显示当前DN上Failover过程中数据页文件同步的进度信息。 返回值类型:record 示例: 1 2 3 4 5 SELECT * FROM pg_data_sync_from_dummy_completion(); start_index | current_index | total_index | sync_percent -------------+---------------+-------------+-------------- 0 | 0 | 0 | 100% (1 row) 函数返回信息如下: 表2 pg_data_sync_from_dummy_completion()字段 名称 类型 描述 start_index integer 数据页文件同步的起始编号 current_index integer 数据页文件同步的当前编号 total_index integer 数据页文件同步的最大编号 sync_percent integer 数据页文件当前完成的百分比
  • TIME FORMAT 输入 COALESCE(t3.Crt_Tm , CAST('00:00:00' AS TIME FORMAT 'HH:MI:SS')) COALESCE(LI07_F3EABCTLP.CTLREGTIM,CAST('${NULL_TIME}' AS TIME FORMAT 'HH:MI:sS')) trim(cast(cast(a.Ases_Orig_Tm as time format'hhmiss') as varchar(10)))
  • TIMESTAMP FORMAT 输入 select a.Org_Id as Brn_Org_Id /* */ ,a.Evt_Id as Vst_Srl_Nbr /* */ ,a.EAC_Id as EAC_Id /* */ ,cast(cast(cast(Prt_Tm as timestamp format 'YYYY-MM-DDBHH:MI:SS' ) as varchar(19) )as timestamp(0)) as Tsk_Start_Tm /* */ from ${BRTL_VCOR}.BRTL_BC_SLF_TMN_RTL_PRT_JNL as a /* BC_ */ where a.DW_Dat_Dt = CAST('${v_Trx_Dt}' AS DATE FORMAT 'YYYY-MM-DD') ;
  • TIMESTAMP(n) FORMAT 输入 select cast('${v_Trx_Dt}' as date format 'yyyy-mm-dd') as DW_Snsh_Dt /* */ ,coalesce(a.CRE_DAT,cast('0001-01-01 00:00:01' as timestamp(6) format 'yyyy-mm-ddbhh:mi:ssds(6)')) as Crt_Tm /* */ ,cast('${v_Trx_Dt}' as date format 'yyyy-mm-dd') as DW_ETL_Dt /* */ ,cast(current_date as date format 'yyyy-mm-dd') as DW_Upd_Dt /* */ ,current_time(0) as DW_Upd_Tm /* */ ,1 as DW_Job_Seq /* */ from ${NDS_VIEW}.NLV65_MGM_GLDCUS_INF_NEW as a /* MGM */ ; ----------- cast('0001-01-01 00:00:00' as timestamp(6) format 'yyyy-mm-ddbhh:mi:ssds(6)') TO_TIMESTAMP('0001-01-01 00:00:00', 'yyyy-mm-dd HH24:MI:SS.US' ) ---------- cast('0001-01-01 00:00:00.000000' as timestamp(6)) cast('0001-01-01 00:00:00.000000' as timestamp(6)) ---------- CAST('0001-01-01 00:00:00.000000' AS TIMESTAMP(6) FORMAT 'YYYY-MM-DDBHH:MI:SS.S(6)') TO_TIMESTAMP('0001-01-01 00:00:00.000000', 'yyyy-mm-dd HH24:MI:SS.US' ) ---------- cast(LA02_USER LOG _M.LOGTIME as TIMESTAMP(6) FORMAT 'YYYY-MM-DD HH:MI:SS.S(0)' ) TO_TIMESTAMP(LA02_USERLOG_M.LOGTIME, 'YYYY-MM-DD HH24:MI:SS' ) ---------- cast('0001-01-01 00:00:00' as timestamp(3) format 'yyyy-mm-ddbhh:mi:ssds(3)') TO_TIMESTAMP('0001-01-01 00:00:00', 'yyyy-mm-dd HH24:MI:SS.MS' ) ----------- CAST( '0001-01-01 00:00:01.000000' AS TIMESTAMP ( 6 ) format 'yyyy-mm-ddbhh:mi:ssds(6)' ) TO_TIMESTAMP('0001-01-01 00:00:01.000000', 'yyyy-mm-dd HH24:MI:SS.US' )
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 CREATE [ [ GLOBAL | LOCAL | VOLATILE ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name { ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option [...] ] } [, ... ])| LIKE source_table [ like_option [...] ] } [ WITH ( {storage_parameter = value} [, ... ] ) ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS } ] [ COMPRESS | NOCOMPRESS ] [ DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { HASH ( column_name [,...] ) } } ] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] [ COMMENT [=] 'text' ]; 其中列约束column_constraint为: 1 2 3 4 5 6 7 8 9 10 [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | ON UPDATE on_update_expr | COMMENT 'text' | UNIQUE [ NULLS [NOT] DISTINCT | NULLS IGNORE ] index_parameters | PRIMARY KEY index_parameters } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 其中列的压缩可选项compress_mode为: 1 { DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS } 其中表约束table_constraint为: 1 2 3 4 5 6 [ CONSTRAINT constraint_name ] { CHECK ( expression ) | UNIQUE [ NULLS [NOT] DISTINCT | NULLS IGNORE ] ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters | PARTIAL CLUSTER KEY ( column_name [, ... ] ) } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 其中like选项like_option为: 1 { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | DISTRIBUTION | DROPCOLUMNS | ALL } 其中索引参数index_parameters为: 1 [ WITH ( {storage_parameter = value} [, ... ] ) ]
  • 注意事项 列存表支持的数据类型请参考列存表支持的数据类型。 创建列存和HDFS分区表的数量建议不超过1000个。 表中的主键约束和唯一约束必须包含分布列。 如果在建表过程中数据库系统发生故障,系统恢复后可能无法自动清除之前已创建的、大小为0的磁盘文件。此种情况出现概率小,不影响数据库系统的正常运行。 列存表支持PARTIAL CLUSTER KEY、主键和唯一表级约束,不支持外键表级约束。 列存表的字段约束只支持NULL、NOT NULL和DEFAULT常量值。 列存表支持delta表,受表级参数enable_delta控制是否开启,受参数deltarow_threshold控制进入delta表的阈值。不推荐使用列存带Delta表,否则会出现由于来不及merge而导致的磁盘膨胀以及性能劣化等问题。 冷热表仅支持列存分区表,依赖于可用的OBS服务。 冷热表仅支持默认表空间为default_obs_tbs,如需新增obs表空间可联系技术支持。
  • MERGE MERGE是一种ANSI标准的SQL语法运算符,用于从一个或多个源中选择行来更新或插入表或视图。用户可指定更新或插入目标表或视图的条件。 DSC使用多种方法将MERGE迁移到GaussDB(DWS)兼容的SQL中。 配置参数mergeImplementation: 默认设置为WITH。设为此值时,目标查询将转换成公用表表达式。 图11 输入:MERGE(1) 图12 输出:MERGE(2) 也可设置为SPLIT。设为此值时,MERGE语句将被分解为多个INSERT和UPDATE语句。 图13 输入:MERGE(3) 图14 输出:MERGE(4)
  • DELAYED 在MySQL 5.7中,DELAYED关键字被接受,但被服务器忽略。 输入示例 1 2 3 4 5 6 7 8 9 # DELAYED 延迟 INSERT DELAYED INTO exmp_tb2 VALUES(99, 15.68, 'good', '2018-11-12'); INSERT DELAYED INTO exmp_tb2 VALUES(80, 12.3, 'cheap', '2018-11-11'); INSERT DELAYED INTO exmp_tb2 VALUES(DEFAULT, 128.23, 'nice', '2018-10-11'); INSERT DELAYED INTO exmp_tb2 VALUES(DEFAULT, DEFAULT, 'nice', '2018-12-14'); INSERT DELAYED INTO exmp_tb2 VALUES(DEFAULT, DEFAULT, 'nice', DEFAULT); INSERT DELAYED INTO exmp_tb2 (tb2_id, tb2_price) VALUES(DEFAULT, DEFAULT); INSERT DELAYED INTO exmp_tb2 (tb2_id, tb2_price, tb2_note) VALUES(DEFAULT, DEFAULT, DEFAULT); INSERT DELAYED INTO exmp_tb2 (tb2_id, tb2_price, tb2_note, tb2_date) VALUES(DEFAULT, DEFAULT, DEFAULT, DEFAULT); 输出示例 1 2 3 4 5 6 7 8 9 -- DELAYED 延迟 INSERT INTO "public"."exmp_tb2" VALUES (99,15.68,'good','2018-11-12'); INSERT INTO "public"."exmp_tb2" VALUES (80,12.3,'cheap','2018-11-11'); INSERT INTO "public"."exmp_tb2" VALUES (DEFAULT,128.23,'nice','2018-10-11'); INSERT INTO "public"."exmp_tb2" VALUES (DEFAULT,DEFAULT,'nice','2018-12-14'); INSERT INTO "public"."exmp_tb2" VALUES (DEFAULT,DEFAULT,'nice',DEFAULT); INSERT INTO "public"."exmp_tb2" ("tb2_id","tb2_price") VALUES (DEFAULT,DEFAULT); INSERT INTO "public"."exmp_tb2" ("tb2_id","tb2_price","tb2_note") VALUES (DEFAULT,DEFAULT,DEFAULT); INSERT INTO "public"."exmp_tb2" ("tb2_id","tb2_price","tb2_note","tb2_date") VALUES (DEFAULT,DEFAULT,DEFAULT,DEFAULT); 父主题: INSERT
  • HASH索引 GaussDB(DWS)不支持HASH索引。DSC工具迁移时会根据GaussDB(DWS)的特性将其迁移为普通索引。 内联HASH索引。 输入示例 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE `public`.`test_create_table03` ( `DEMAND_ID` INT(11) NOT NULL AUTO_INCREMENT, `DEMAND_NAME` CHAR(100) NOT NULL, `THEME` VARCHAR(200) NULL DEFAULT NULL, `SEND_ID` INT(11) NULL DEFAULT NULL, `SEND_NAME` CHAR(20) NULL DEFAULT NULL, `SEND_TIME` DATETIME NULL DEFAULT NULL, `DEMAND_CONTENT` TEXT NOT NULL, PRIMARY KEY(`DEMAND_ID`), INDEX CON_INDEX(DEMAND_CONTENT(100)) USING HASH , INDEX SEND_INFO_INDEX USING HASH (SEND_ID,SEND_NAME(10),SEND_TIME) ); 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE TABLE "public"."test_create_table03" ( "demand_id" SERIAL NOT NULL, "demand_name" CHAR(400) NOT NULL, "theme" VARCHAR(800) DEFAULT NULL, "send_id" INTEGER DEFAULT NULL, "send_name" CHAR(80) DEFAULT NULL, "send_time" TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL, "demand_content" TEXT NOT NULL, PRIMARY KEY ("demand_id") ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("demand_id"); CREATE INDEX "con_index" ON "public"."test_create_table03" ("demand_content"); CREATE INDEX "send_info_index" ON "public"."test_create_table03" ("send_id","send_name","send_time"); ALTER TABLE创建HASH索引。 输入示例 1 2 3 4 5 6 7 CREATE TABLE IF NOT EXISTS `public`.`runoob_alter_test`( `dataType1` int NOT NULL AUTO_INCREMENT, `dataType2` FLOAT(10,2), PRIMARY KEY(`dataType1`) )ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE runoob_alter_test ADD KEY alterTable_addKey_indexType(dataType1) USING HASH; 输出示例 1 2 3 4 5 6 7 8 9 10 11 CREATE TABLE IF NOT EXISTS "public"."runoob_alter_test" ( "datatype1" SERIAL NOT NULL, "datatype2" REAL, PRIMARY KEY ("datatype1") ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("datatype1"); CREATE INDEX "altertable_addkey_indextype" ON "public"."runoob_alter_test" ("datatype1"); CREATE INDEX创建HASH索引。 输入示例 1 2 3 4 5 6 7 8 CREATE TABLE `public`.`test_index_table06` ( `ID` INT(11) NOT NULL AUTO_INCREMENT, `FNAME` VARCHAR(30) NOT NULL, `INAME` VARCHAR(30) NOT NULL, PRIMARY KEY (`ID`) ); CREATE INDEX FNAME_INDEX ON TEST_INDEX_TABLE06(FNAME(10)) USING HASH; CREATE INDEX NAME_01 ON TEST_INDEX_TABLE06(FNAME(10),INAME(10)) USING HASH; 输出示例 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE "public"."test_index_table06" ( "id" SERIAL NOT NULL, "fname" VARCHAR(120) NOT NULL, "iname" VARCHAR(120) NOT NULL, PRIMARY KEY ("id") ) WITH ( ORIENTATION = ROW, COMPRESSION = NO ) NOCOMPRESS DISTRIBUTE BY HASH ("id"); CREATE INDEX "fname_index" ON "public"."test_index_table06" ("fname"); CREATE INDEX "name_01" ON "public"."test_index_table06" ("fname","iname"); 父主题: 索引
  • 功能描述 SET CONSTRAINTS设置当前事务检查行为的约束条件。 IMMEDIATE约束是在每条语句后面进行检查。DEFERRED约束一直到事务提交时才检查。每个约束都有自己的模式。 从创建约束条件开始,一个约束总是设定为DEFERRABLE INITIALLY DEFERRED,DEFERRABLE INITIALLY IMMEDIATE,NOT DEFERRABLE三个特性之一。第三种总是IMMEDIATE,并且不会受SET CONSTRAINTS影响。前两种以指定的方式启动每个事务,但是其行为可以在事务里用SET CONSTRAINTS改变。 带着一个约束名列表的SET CONSTRAINTS改变这些约束的模式(都必须是可推迟的)。如果有多个约束匹配某个名字,则所有都会被影响。SET CONSTRAINTS ALL改变所有可推迟约束的模式。 当SET CONSTRAINTS把一个约束从DEFERRED改成IMMEDIATE的时候,新模式反作用式地起作用:任何将在事务结束准备进行的数据修改都将在SET CONSTRAINTS的时候执行检查。如果违反了任何约束,SET CONSTRAINTS都会失败(并且不会修改约束模式)。因此,SET CONSTRAINTS可以用于强制在事务中某一点进行约束检查。 目前,只有外键约束被该设置影响。检查和唯一约束总是不可推迟的。
  • 包拆分 包规范迁移为以包名命名的模式,包体中的存储过程和函数迁移为Packagename.procedurename和Packagename.funtionname。 设置pkgSchemaNaming=true后,可以进行迁移。 输入: PACKAGE1.FUNC1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 CREATE OR REPLACE PACKAGE BODY pack AS FUNCTION get_fullname(n_emp_id NUMBER) RETURN VARCHAR2 IS v_fullname VARCHAR2(46); BEGIN SELECT first_name || ',' || last_name INTO v_fullname FROM employees WHERE employee_id = n_emp_id; RETURN v_fullname; END get_fullname; PROCEDURE get_salary(n_emp_id NUMBER) RETURN NUMBER IS n_salary NUMBER(8,2); BEGIN SELECT salary INTO n_salary FROM employees WHERE employee_id = n_emp_id; END get_salary; END pack; / 输出 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 CREATE OR REPLACE FUNCTION pack.get_fullname ( n_emp_id NUMBER ) RETURN VARCHAR2 IS v_fullname VARCHAR2 ( 46 ) ; BEGIN SELECT first_name || ',' || last_name INTO v_fullname FROM employees WHERE employee_id = n_emp_id ; RETURN v_fullname ; END ; / CREATE OR REPLACE FUNCTION pack.get_salary ( n_emp_id NUMBER ) RETURN NUMBER IS n_salary NUMBER ( 8 ,2 ) ; BEGIN SELECT salary INTO n_salary FROM employees WHERE employee_id = n_emp_id ; RETURN n_salary ; END ; / 若pkgSchemaNaming为false,可拆分包。 当bas_lookup_misc_pkg调用insert_fnd_data_change_logs时,不会迁移insert_fnd_data_change_logs。 输入 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 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 ; PROCEDURE data_change_logs ( pi_table_name IN VARCHAR2 , pi_table_key_columns IN VARCHAR2 , po_error_msg OUT VARCHAR2 ) IS BEGIN g_func_name := 'insert_fnd_data_change_logs_t'; INSERT INTO fnd_data_change_logs_t ( logid, table_name, table_key_columns ) VALUES ( fnd_data_change_logs_t_s.NEXTVAL , pi_table_name, pi_table_key_columns ); EXCEPTION WHEN OTHERS THEN po_error_msg := 'Others Exception raise in ' || func_name || ',' || SQLERRM; 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 CREATE OR REPLACE FUNCTION SAD.bas_dml_lookup_pkg#func_name RETURN VARCHAR2 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 ; 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 ) IS MIG_PV_VAL_DUMMY_G_FUNC_NAME VARCHAR2(30) := MIG_ORA_EXT.MIG_FN_GET_PKG_VARIABLE ( 'SAD' ,'BAS_DML_LOOKUP_PKG' ,'G_FUNC_NAME' )::VARCHAR2(30) ; BEGIN MIG_PV_VAL_DUMMY_G_FUNC_NAME := 'insert_fnd_data_change_logs_t' ; INSERT INTO fnd_data_change_logs_t ( logid,table_name,table_key_columns ) VALUES ( NEXTVAL ( 'fnd_data_change_logs_t_s' ) , pi_table_name, pi_table_key_columns ) ; MIG_ORA_EXT.MIG_FN_SET_PKG_VARIABLE ( 'SAD', 'BAS_DML_LOOKUP_PKG', 'G_FUNC_NAME', MIG_PV_VAL_DUMMY_G_FUNC_NAME ) ; EXCEPTION WHEN OTHERS THEN po_error_msg := 'Others Exception raise in ' || SAD.bas_dml_lookup_pkg#func_name( ) || ',' || SQLERRM ; MIG_ORA_EXT.MIG_FN_SET_PKG_VARIABLE ( 'SAD', 'BAS_DML_LOOKUP_PKG', 'G_FUNC_NAME', MIG_PV_VAL_DUMMY_G_FUNC_NAME ) ; END ; / PACKAGE关键字 内核需要将包标签添加到从包转换来的函数和存储过程。 输入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE OR REPLACE PACKAGE BODY SAD.bas_dml_lookup_pkg IS FUNCTION func_name RETURN VARCHAR2 IS l_func_name VARCHAR2(100) ; BEGIN l_func_name := 'bas_dml_lookup_pkg' || '.' || 'func_name' ; RETURN l_func_name ; END ; END bas_dml_lookup_pkg ; / 输出 1 2 3 4 5 6 7 8 9 10 11 CREATE OR REPLACE FUNCTION func_name RETURN VARCHAR2 PACKAGE IS l_func_name VARCHAR2(100) ; BEGIN l_func_name := 'bas_dml_lookup_pkg' || '.' || 'func_name' ; RETURN l_func_name ; END ; / 父主题: PL/SQL包
  • 创建索引 为了加速文本搜索,可以创建GIN索引。 1 CREATE INDEX pgweb_idx_1 ON tsearch.pgweb USING gin(to_tsvector('english', body)); to_tsvector()函数有两个版本,只输一个参数的版本和输两个参数的版本。 只输一个参数时,系统默认采用default_text_search_config所指定的分词器。 创建索引时必须使用to_tsvector的两参数版本,否则索引内容可能不一致。只有指定了分词器名称的全文检索函数才可以在索引表达式中使用。因为索引的内容不受default_text_search_config的影响。由于default_text_search_config的值可以随时调整,从而导致不同条目生成的tsvector采用了不同的分词器,并且无法区分究竟使用了哪个分词器。正确地转储和恢复这样的索引也是不支持的。 在上述创建索引中to_tsvector使用了两个参数,只有当查询时也使用了两个参数,且参数值与索引中相同时,才会使用该索引。例如,WHERE to_tsvector('english', body) @@ 'a & b' 可以使用索引,但WHERE to_tsvector(body) @@ 'a & b'不能使用索引。这确保索引各条目是使用相同的分词器创建的。 索引中的分词器名称由另一列指定时可以建立更复杂的表达式索引。例如: 1 CREATE INDEX pgweb_idx_2 ON tsearch.pgweb USING gin(to_tsvector('zhparser', body)); 本示例中zhparser仅支持UTF8/GBK的数据库编码格式,在Encoding为SQL_ASCII下会报错。 其中body是pgweb表中的一列。当对索引的各条目使用了哪个分词器进行记录时,允许在同一索引中存在混合分词器。在某些场景下这将是有用的。例如,文档集合中包含不同语言的文档时。再次强调,打算使用索引的查询必须措辞匹配,例如,WHERE to_tsvector(config_name, body) @@ 'a & b'与索引中的to_tsvector措辞匹配。 索引甚至可以连接列: 1 CREATE INDEX pgweb_idx_3 ON tsearch.pgweb USING gin(to_tsvector('english', title || ' ' || body)); 另一个方法是创建一个单独的tsvector列控制to_tsvector的输出。下面的例子是title和body的连接, 当其它是NULL的时候,使用coalesce确保一个字段仍然会被索引: 1 2 ALTER TABLE tsearch.pgweb ADD COLUMN textsearchable_index_col tsvector; UPDATE tsearch.pgweb SET textsearchable_index_col = to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,'')); 然后为加速搜索创建一个GIN索引: 1 CREATE INDEX textsearch_idx_4 ON tsearch.pgweb USING gin(textsearchable_index_col); 现在,就可以执行一个快速全文搜索了: 1 2 3 4 5 6 7 8 9 10 11 SELECT title FROM tsearch.pgweb WHERE textsearchable_index_col @@ to_tsquery('science & Computer') ORDER BY last_mod_date DESC LIMIT 10; title -------- Computer science (1 rows) 相比于一个表达式索引,单独列方法的一个优势是:它没有必要在查询时明确指定分词器以便能使用索引。正如上面例子所示,查询可以依赖于default_text_search_config。另一个优势是搜索比较快速,因为它没有必要重新利用to_tsvector调用来验证索引匹配。表达式索引方法更容易建立,且它需要较少的磁盘空间,因为tsvector形式没有明确存储。 父主题: 表和索引
  • 软件要求 操作系统要求 DSC兼容的操作系统如表4所示。 表4 兼容的操作系统 服务器 操作系统 版本 通用x86服务器 SUSE Linux Enterprise Server 11 SP1(SUSE11.1) SP2(SUSE11.2) SP3(SUSE11.3) SP4(SUSE11.4) SUSE Linux Enterprise Server 12 SP0(SUSE12.0) SP1(SUSE12.1) SP2(SUSE12.2) SP3(SUSE12.3) RHEL 6.4-x86_64(RedHat6.4) 6.5-x86_64(RedHat6.5) 6.6-x86_64(RedHat6.6) 6.7-x86_64(RedHat6.7) 6.8-x86_64(RedHat6.8) 6.9-x86_64(RedHat6.9) 7.0-x86_64(RedHat7.0) 7.1-x86_64(RedHat7.1) 7.2-x86_64(RedHat7.2) 7.3-x86_64(RedHat7.3) 7.4-x86_64(RedHat7.4) CentOS 6.4(CentOS6.4) 6.5(CentOS6.5) 6.6(CentOS6.6) 6.7(CentOS6.7) 6.8(CentOS6.8) 6.9(CentOS6.9) 7.0(CentOS7.0) 7.1(CentOS7.1) 7.2(CentOS7.2) 7.3(CentOS7.3) 7.4(CentOS7.4) Windows 7.0,10,11 其他软件要求 DSC对其他软件版本的要求如表5所示。 表5 其他软件要求 软件 用途 JDK 1.8.0_141 or later Used to run DSC. Perl 5.8.8 Used to migrate Perl files. Perl 5.28.2 and later Used to migrate Perl files in Windows. Python 3.8.2 Used to verify post migration script.
  • NOT IN expression NOT IN (value [, ...]) 右侧括号中的是一个表达式列表。左侧表达式的结果与表达式列表的内容进行比较。如果在列表中的内容没有符合左侧表达式结果的内容,则NOT IN的结果为true。如果有符合的内容,则NOT IN的结果为false。 示例如下: 1 2 3 4 5 SELECT 8000+500 NOT IN (10000, 9000) AS RESULT; result ---------- t (1 row) 如果查询语句返回结果为空,或者表达式列表不符合表达式的条件且右侧表达式列表返回结果至少一处为空,则NOT IN的返回结果为null,而不是false。这样的处理方式和SQL返回空值的布尔组合规则是一致的。 提示:在所有情况下X NOT IN Y等价于NOT(X IN Y)。
  • IN expression IN (value [, ...]) 右侧括号中的是一个表达式列表。左侧表达式的结果与表达式列表的内容进行比较。如果列表中的内容符合左侧表达式的结果,则IN的结果为true。如果没有相符的结果,则IN的结果为false。 示例如下: 1 2 3 4 5 SELECT 8000+500 IN (10000, 9000) AS RESULT; result ---------- f (1 row)
  • 参数说明 database_name 需要修改属性的数据库名称。 取值范围:字符串,要符合标识符的命名规范。 connlimit 数据库可以接收的最大并发连接数(管理员用户连接除外)。 取值范围:整数,建议填写1~50的整数。-1(缺省)表示没有限制。 new_name 数据库的新名称。 取值范围:字符串,要符合标识符的命名规范。 new_owner 数据库的新所有者。 取值范围:字符串,有效的用户名。 configuration_parameter value 把指定的数据库会话参数值设置为给定的值。如果value是DEFAULT或者RESET,则在新的会话中使用系统的缺省设置。OFF关闭设置。 取值范围:字符串, DEFAULT OFF RESET FROM CURRENT 根据当前会话连接的数据库设置该参数的值。 RESET configuration_parameter 重置指定的数据库会话参数值。 RESET ALL 重置全部的数据库会话参数值。 修改数据库默认表空间,会将旧表空间中的所有表和索引转移到新表空间中,该操作不会影响其他非默认表空间中的表和索引。 修改的数据库会话参数值,将在下一次会话中生效。
  • 示例 设置music数据库的连接数为10: 1 ALTER DATABASE music CONNECTION LIMIT= 10; 将music名称改为music1: 1 ALTER DATABASE music RENAME TO music1; 将数据库music1的所属者改为tom: 1 ALTER DATABASE music1 OWNER TO tom; 设置music1的表空间为PG_DEFAULT: 1 ALTER DATABASE music1 SET TABLESPACE PG_DEFAULT; 关闭在数据库music1上缺省的索引扫描: 1 ALTER DATABASE music1 SET enable_indexscan TO off; 重置enable_indexscan参数: 1 ALTER DATABASE music1 RESET enable_indexscan;
  • 注意事项 只有拥有数据库所有者权限的用户才能执行ALTER DATABASE命令,系统管理员默认拥有此权限。如果是非系统管理员,针对所要修改属性的不同,对其还有以下权限约束: 修改数据库名称,必须拥有CREATEDB权限。 修改数据库所有者,当前用户必须是该数据库的所有者,且拥有CREATEDB权限,并确保该用户是新所有者角色的成员。 修改数据库默认表空间,该用户必须是该数据库的所有者或系统管理员,且拥有新表空间的CREATE权限。该语法会从物理上将一个数据库原来缺省表空间上的表和索引移至新的表空间。注意不在缺省表空间的表和索引不受此影响。 修改某个按数据库设置的相关参数,只有数据库所有者或者系统管理员可以改变这些设置。 修改某个数据库对象隔离属性,只有数据库所有者或者系统管理员可以执行此操作。 不能重命名当前使用的数据库,如果需要重新命名,须连接至其他数据库上。 不支持修改现有数据库的兼容模式,只能在创建数据库时指定兼容模式,详情请参见CREATE DATABASE。
  • 语法格式 修改数据库的最大连接数。 1 2 ALTER DATABASE database_name [ [ WITH ] CONNECTION LIMIT connlimit ]; 修改数据库名称。 1 2 ALTER DATABASE database_name RENAME TO new_name; 若该数据库中有OBS冷热表,则不支持修改数据库名。 修改数据库所属者。 1 2 ALTER DATABASE database_name OWNER TO new_owner; 修改数据库默认表空间。 1 2 ALTER DATABASE database_name SET TABLESPACE new_tablespace; 修改数据库的表空间时不能修改为OBS表空间。 修改数据库指定会话参数值。 1 2 ALTER DATABASE database_name SET configuration_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT }; 数据库配置参数重置。 1 2 ALTER DATABASE database_name RESET { configuration_parameter | ALL };
  • 软件要求 操作系统要求 Data Studio的操作系统配置要求如下表所示。 表1 支持操作系统及相应软件包 服务器 操作系统 支持版本 通用x86服务器 Windows Windows 7 (64 bit) Windows 10 (64 bit) Windows 2012 (64 bit) Windows 2016 (64 bit) 浏览器要求 Data Studio的浏览器要求如下表所示。 操作系统 版本 Windows IE 11及以上 其他软件要求 Data Studio的软件配置要求如下表所示。 表2 Data Studio软件要求 软件 规格 Java 推荐与操作系统位数对应的Open JDK 1.8版本 GNU libc 显示DDL,导入DDL,导出DDL和数据操作只支持GN系统libc 2.17以上的版本。 表3 支持的数据库版本 数据库 版本 GaussDB(DWS) 1.2.x 1.5.x 8.0.x 8.1.x 8.2.x 保证最佳体验的情况下,推荐的最小屏幕分辨率是1080 x 768。低于此分辨率,界面会异常。
  • 支持序列DDL Data Studio支持用户进行显示序列DDL和导出序列DDL操作,包括“显示DDL”,“导出DDL”,“导出DDL和数据”。 在“对象浏览器”窗格中,右键单击序列名,显示菜单选项。 选择“显示DDL”选项查看DDL语句。 选择“导出DDL”选项导出DDL语句。 选择“导出DDL和数据”选项导出DDL和select语句。 如下图所示: 只有序列所有者或系统管理员,或具有序列的select权限的用户,才能进行上述操作。
  • 创建序列 在“对象浏览器”窗格,右键单击“序列”,然后选择“创建序列”。Data Studio弹出“创建序列”对话框。 设置相关参数以创建序列。 在“序列名称”字段输入序列名称。 勾选“区分大小写”,“序列名称”字段文本将区分大小写。例如,输入的序列名称为“Employee”,则序列名称将创建为“Employee”。 在“最小值”字段输入最小值。 在“增量”字段输入要递增的值。 在“最大值”字段输入最大值。 最大和最小值的取值范围应在-9223372036854775808到9223372036854775807之间。 在“初始值”字段输入序列的起始值。 在“缓存数值”字段输入缓存信息。缓存值表示存储在内存中用于快速访问的数字序列。 勾选“循环”,可在序列数达到最大或最小值时进行循环。 该模式名称自动填充到“模式”字段。 在“表”中选择对应表。 在“列”中选择对应列。 单击“完成”。 状态栏显示已完成操作的状态。 可在“SQL预览”页签自动查看输入数据的SQL查询。
共100000条