首页 > 数据库 >一种DWS迁移Oracle的CONNECT BY语法的方案

一种DWS迁移Oracle的CONNECT BY语法的方案

时间:2023-05-18 11:45:13浏览次数:48  
标签:DWS bas INSTRUMENT instrument CONNECT Oracle id name

摘要:本文提供一种GaussDB DWS迁移CONNECT BY语法方案。

本文分享自华为云社区《GaussDB(DWS)迁移 - oracle兼容 -- CONNECT BY迁移》,作者: 譡里个檔 。

CONNECT BY NOCYCLE

1) 预置对象定义

DROP SCHEMA IF EXISTS "sdifin" CASCADE;
CREATE SCHEMA "sdifin";
DROP TABLE IF EXISTS "sdifin"."ogg_ets_bas_instrument_t_2670";
SET search_path = sdifin;
CREATE TABLE ogg_ets_bas_instrument_t_2670 (
 bas_instrument_id numeric NOT NULL,
 instrument_name character varying(600),
 instrument_parent_id numeric,
 status numeric
)
WITH (enable_hstore=on, orientation=column, compression=yes, enable_delta=false, colversion=2.0, max_batchrow=60000)
DISTRIBUTE BY HASH(bas_instrument_id);
DROP TABLE IF EXISTS "sdifin"."ogg_sectype_2360";
SET search_path = sdifin;
CREATE TABLE ogg_sectype_2360 (
 thekey character varying(18) NOT NULL,
        name character varying(150)
)
WITH (enable_hstore=on, orientation=column, compression=yes, enable_delta=false, colversion=2.0, max_batchrow=60000)
DISTRIBUTE BY REPLICATION;

2) oracle原始语句

SELECT
 to_char(i.BAS_INSTRUMENT_ID) AS INSTRUMENT_ID,
 to_char(i.INSTRUMENT_PARENT_ID) AS parent_thekey,
    TRIM(i.INSTRUMENT_NAME) AS INSTRUMENT_NAME,
    SYS_CONNECT_BY_PATH(i.INSTRUMENT_NAME, ';') AS INSTRUMENT_PATH,
    SYS_CONNECT_BY_PATH(i.BAS_INSTRUMENT_ID, '->') AS BAS_ID_PATH,  
 LEVEL AS INSTRUMENT_LEVEL,
    CONNECT_BY_ISCYCLE AS CYCLE_ERROR,
 2670 AS ss_id
 FROM OGG_ETS_BAS_INSTRUMENT_T_2670 i, OGG_SECTYPE_2360 s2
WHERE upper(i.instrument_name) = upper(TRIM(s2.name(+)))
AND s2.thekey IS NULL AND I.STATUS = 1
CONNECT BY NOCYCLE PRIOR i.BAS_INSTRUMENT_ID = i.INSTRUMENT_PARENT_ID
START WITH i.instrument_parent_id IS NULL

oracle中的执行计划

关键点:

1)语句特征:SQL语句中WHERE字句包含非关联条件

2)执行特征:WHERE字句中的非关联条件计算的优先级低于CONNECT BY,即CONNECT BY执行之后才会进行这些条件的过滤,如上id=2的FILTER条件

3) DWS等价改写逻辑

WITH RECURSIVE TMP_ETC AS (
 SELECT
 to_char(i.bas_instrument_id) AS instrument_id,
 to_char(i.instrument_parent_id) AS parent_thekey,
        trim(i.instrument_name) AS instrument_name,
 ';'||i.instrument_name AS instrument_path,
 '->'||i.bas_instrument_id AS bas_id_path,
 1 AS instrument_level,
 0 AS cycle_error,
 2670 AS ss_id,
        s2.thekey,
 i.status,
 i.bas_instrument_id AS start_val
 FROM sdifin.ogg_ets_bas_instrument_t_2670 i
 LEFT JOIN sdifin.ogg_sectype_2360 s2 ON upper(trim(i.instrument_name)) = upper(trim(s2.name))
 WHERE i.instrument_parent_id IS NULL
 UNION ALL
 SELECT
 to_char(i.bas_instrument_id) AS instrument_id,
 to_char(i.instrument_parent_id) AS parent_thekey,
        trim(i.instrument_name) AS instrument_name,
        (b.instrument_path ||';'||i.instrument_name) AS instrument_path,
        (b.bas_id_path ||'->'||i.bas_instrument_id) AS bas_id_path,
 b.instrument_level+1 AS instrument_level,
        decode(trim(i.bas_instrument_id)=b.start_val,false,0,1) AS cycle_error,
 2670 AS ss_id,
        s2.thekey,
 i.status,
 b.start_val AS start_val
 FROM sdifin.ogg_ets_bas_instrument_t_2670 i
 LEFT JOIN sdifin.ogg_sectype_2360 s2 ON upper(i.instrument_name) = upper(trim(s2.name))
 INNER JOIN tmp_etc b ON b.instrument_id = i.instrument_parent_id
 WHERE b.cycle_error <> 1
)
SELECT 
 instrument_id,
 parent_thekey,
 instrument_name,
 instrument_path,
 bas_id_path,
 instrument_level,
 cycle_error,
 ss_id
FROM tmp_etc
WHERE thekey IS NULL
AND status = 1

 

点击关注,第一时间了解华为云新鲜技术~

标签:DWS,bas,INSTRUMENT,instrument,CONNECT,Oracle,id,name
From: https://www.cnblogs.com/huaweiyun/p/17411465.html

相关文章

  • Oracle中dba,user,v$等开头的常用表和视图
    1、https://blog.csdn.net/a545812327/article/details/123146508或者遇见了也不知道是做什么用的,该文档主要用来供各位参考,以便更好的使用Oracle,有错误、缺失的地方欢迎指正。1Oracle常用表1.1dba_开头表1.2user_开头表1.3v$_开头表1.4all_开头表1.5session_开头表1.6i......
  • Windows10安装oracle 19c数据库+PLsql详细安装过程
    Windows版Oracle19c安装过程记录文章目录Windows版Oracle19c安装过程记录前言安装过程1下载2安装3检查是否安装成功。PLSQL连接Oracle数据库前言安装Windows版Oracle19c。官网:https://www.oracle.com/database/technologies/安装过程首先在百度上搜索Windows版Oraclec19安装。1......
  • Plsql或Navicat连接登陆Oracle时慢、执行语句的时候也特别慢的问题解决方案
    用Plsql或Navicat连接登陆Oracle时,等待时间特别长。经过漫长的等待后,执行语句的时候也特别慢,监听配置没毛病的情况下,大概率是监听日志文件过大导致的。监听日志路径:app\Administrator\diag\tnslsnr\LS--20171012URU\listener\trace\listener.log删除listener.log文件即可。......
  • forwardRef 与 connect一起使用出现的问题
    今天在项目中发现使用forwardRef转发用conenct包裹的组件,怎么都拿不到提供给父组件的方法,百思不得其解。最后看到了这篇文章  React.forwardRef和connect的联合使用问题 才知道。 原来是这里惹的祸。还有,像这种高阶组件。connect要在第一层,forwardRef在第二层。  ......
  • Oracle删除列操作:逻辑删除和物理删除
    概念逻辑删除:逻辑删除并不是真正的删除,而是将表中列所对应的状态字段(status)做修改操作,实际上并未删除目标列数据或恢复这些列占用的磁盘空间。比如0是未删除,1是删除。在逻辑上数据是被删除了,但是数据本身还在数据库中,只是不进行对外提供了,逻辑删除的本质是修改操作(将is_delete的......
  • Putty连接虚拟机(在win11中安装的ubuntu20.04)提示: Network error: Connection refus
    #开启防火墙sudoufwenable#开启22号端口sudoufwallow22#重启防火墙sudoufwreload#查看状态sudoufwstatus#安装sshsudoaptinstallopenssh-server#尝试能否远程登录sshlocalhost......
  • Oracle客户端导出服务端数据(数据泵)生成DMP文件并导入
    1.首先了解下EXPDP和EXP的区别   1)EXP和IMP是客户端工具程序,它们既可以在可以客户端使用,也可以在服务端使用。   2)EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLEQ服务端使用,不能在客户端使用   3)IMP只适用于EXP导出文件,不适用于EXPDP导出文件......
  • oracle 10G
      oracle10G安装:数据库口令不可以全部都是数字,否则无法顺利开启EnterpriseManager管理工具 管理工具:SQLplus isqlplus  http:;//localhost:5560/isqlplusEnterpriseManager http:;//localhost:5500/em启动数据库:startupopemmisbb若权限不是 ......
  • Oracle19c中环境变量ORACLE_PDB_SID对dbca和RU打补丁的影响
     Oracle19c中环境变量ORACLE_PDB_SID对dbca和RU打补丁的影响 假设需要dbca创建一个cdb为oemdb,pdb为empdbrepos。同时,环境变量已经设置了ORACLE_PDB_SID=empdbrepos的情况下进行dbca,会导致dbca报错如下:ORA-65118:operationaffectingapluggabledatabasecannotbeperfo......
  • oracle startup命令
    1、https://dianzubuluo.com/%E6%9C%AA%E5%91%BD%E5%90%8D/117215.htmlhttps://wenku.baidu.com/view/2ded5a0bedfdc8d376eeaeaad1f34693dbef1057.html?_wkts_=1684286608746&bdQuery=oracle+startup%E5%91%BD%E4%BB%A4https://blog.csdn.net/weixin_45641933/article/d......