linuxsir首页 LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与欢迎您!
网站首页 | 设为首页 | 加入收藏
您所在的位置:主页 > Linux数据库 >

Oracle 10.2.0.4 sql关联查询语句中含有 connect by 导致报错出

时间:2019-05-10  来源:未知  作者:admin666

写了个视图导致出现报错:网上说是Oracle 10.2.0.4和10.2.0.3版本的一个bug

SELECT A.*FROM  PL_PLAN_BASE  A
      left JOIN
        (SELECT B.CATEGORY_ID,
              REGEXP_SUBSTR(SYS_CONNECT_BY_PATH( B.CLASS_NAME,'/'),'[^/]+',1,1,'i')  FIRST_NAME,
              REGEXP_SUBSTR(SYS_CONNECT_BY_PATH( B.CLASS_NAME,'/'),'[^/]+',1,2,'i')  SECOND_NAME,
              B.CLASS_NAME                                                          THIRD_NAME
        FROM  PC_CATEGORY_BASE B
        START WITH B.PARENT_ID IS NULL
        CONNECT BY  B.PARENT_ID=PRIOR B.CATEGORY_ID  ) C  ON  A.CATEGORY_ID=C.CATEGORY_ID 
        LEFT JOIN
        (SELECT DEPT_NAME,DEPT_CODE FROM  BI_DEPT ) D ON D.DEPT_CODE=A.APPLY_DEPT_CODE
        LEFT JOIN
        (SELECT  T.CATEGORY_ID,D.DEPT_NAME,T.ORG_CODE
          FROM  PC_CATEGORY_ORG T,BI_DEPT D
          WHERE  T.CENTRALIZED_DEP_CODE=D.DEPT_CODE
            )E  ON (E.CATEGORY_ID =a.Category_Id  AND E.ORG_CODE=A.CRT_ORG_CODE)
        where a.data_state='0'
          and a.plan_org_name not like '%测试%'
          and a.plan_material_name not like '%测试%' 
          and a.crt_org_name not like '%null%';

1  如果关联语句不是很多是不会报错:比如下面这样是可以查出来 

SELECT A.*FROM  PL_PLAN_BASE  A
      left JOIN
        (SELECT B.CATEGORY_ID,
              REGEXP_SUBSTR(SYS_CONNECT_BY_PATH( B.CLASS_NAME,'/'),'[^/]+',1,1,'i')  FIRST_NAME,
              REGEXP_SUBSTR(SYS_CONNECT_BY_PATH( B.CLASS_NAME,'/'),'[^/]+',1,2,'i')  SECOND_NAME,
              B.CLASS_NAME                                                          THIRD_NAME
        FROM  PC_CATEGORY_BASE B
        START WITH B.PARENT_ID IS NULL
        CONNECT BY  B.PARENT_ID=PRIOR B.CATEGORY_ID  ) C  ON  A.CATEGORY_ID=C.CATEGORY_ID 
        LEFT JOIN
        (SELECT DEPT_NAME,DEPT_CODE FROM  BI_DEPT ) D ON D.DEPT_CODE=A.APPLY_DEPT_CODE 

2 如果关联语句太多就会报错 比如上面的. 

3 解决办法: 

1 修改SQL语句,不要这个递归,去掉这个connect by ; 

2 这么修改,修改这个参数调整优化器的版本:  alter session set optimizer_features_enable='10.2.0.1'; 

 3 修改这个参数:_optimizer_connect_by_cost_based 为 false; 

 我们这边是针对本session的进行语句级修改,只针对这个语句,所以不影响整个库: 

ALTER SESSION SET "  _optimizer_connect_by_cost_based  "=false; 

我这边选择第三种,但是我们这个是要经常查询的,我可以直接加到 hint 里面去,就可以: 

CREATE OR REPLACE VIEW V_TW_PURCHASE_PL_STAT1 AS 

 SELECT  /*+ OPT_PARAM('_optimizer_connect_by_cost_based' 'false') */ 
        A.PLAN_ID,                                                                               
        DECODE(A.PLAN_TYPE,'0','年初计划','1','中期调整',A.PLAN_TYPE)          PLAN_TYPE,       
        A.PLAN_YEAR,                                                                             
        A.CATEGORY_ID,                                                                           
        C.FIRST_NAME,   
        .................................
        FROM  PL_PLAN_BASE  A
      left JOIN
      (SELECT B.CATEGORY_ID,
              REGEXP_SUBSTR(SYS_CONNECT_BY_PATH( B.CLASS_NAME,'/'),'[^/]+',1,1,'i')  FIRST_NAME,
              REGEXP_SUBSTR(SYS_CONNECT_BY_PATH( B.CLASS_NAME,'/'),'[^/]+',1,2,'i')  SECOND_NAME,
              B.CLASS_NAME                                                          THIRD_NAME
        FROM  PC_CATEGORY_BASE B
        START WITH B.PARENT_ID IS NULL
        CONNECT BY B.PARENT_ID=PRIOR B.CATEGORY_ID  ) C  ON  A.CATEGORY_ID=C.CATEGORY_ID
        LEFT JOIN
        (SELECT DEPT_NAME,DEPT_CODE FROM  BI_DEPT ) D ON D.DEPT_CODE=A.APPLY_DEPT_CODE
        LEFT JOIN
        (SELECT  T.CATEGORY_ID,D.DEPT_NAME,T.ORG_CODE
          FROM  PC_CATEGORY_ORG T,BI_DEPT D
          WHERE  T.CENTRALIZED_DEP_CODE=D.DEPT_CODE
            )E  ON (E.CATEGORY_ID =a.Category_Id  AND E.ORG_CODE=A.CRT_ORG_CODE)
        where a.data_state='0'
          and a.plan_org_name not like '%测试%'
          and a.plan_material_name not like '%测试%'
          and a.crt_org_name not like '%null%';

再次查询就不会报错:可以查出来。 

这边是针对该版本,后面的版本ORACLE 是修复了 

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

友情链接
  • JupyterHub 1.0 发布,命名服务器与TLS加密支持
  • Linux Kernel 5.1 正式发布,大量新功能
  • Red Hat Enterprise Linux 8.0(RHEL8)正式发布了
  • RStudio 1.2发布,改进对Python chunks,R脚本等的测试和支持
  • Firefox 66.0.4 发布,解决由于证书过期而导致的插件损坏问题
  • Ubuntu 14.04(Trusty Tahr)达到生命终点,现在升级到Ubuntu 18
  • 微软宣布推出“Windows Terminal”,受Linux风格启发终端
  • 印度将于5月成立国防网络局
  • Linux Mint 17达到了生命终结,用户需要升级到Linux Mint 18或19
  • Btrfs在Linux 5.2内核中获得一些有用的修复/改进
  • Unigine 2.8 发布,更好的植被与异步数据流
  • macOS版本的Microsoft Edge 浏览器下载地址泄露
  • GNU Linux
  • Linux Kernel 5.1 应该会在今天发布,更快的zRAM
  • Linux版的Microsoft Edge浏览器可能在工作中
  • Ubuntu Linux现在支持微软的第二代Windows Linux子系统(WSL 2 )
  • Visual Studio Code添加Java 12支持,Java代码操作和语言功能
  • 微软宣布推出Windows Subsystem for Linux 2(WSL 2)
  • Ubuntu 19.10代号为“Eoan Ermine”,将于10月17日发布
  • Brackets 1.14 发布,LSP支持(Ubuntu下安装方法)
  • 微软为Windows 10带来原生Linux内核,将成为WSL 2的一部分
  • 2019年GitHub上最受欢迎的7种编程语言
  • Linux 5.2应该可以解决许多AMD Ryzen笔记本电脑触摸屏/触摸板无
  • 适用于Linux的最佳Photoshop替代品
  • 谈判失败:Oracle 杀死 Java EE
  • DXVK 1.1.1 发布,解决召回的DXVK 1.1问题
  • Ant Design 3.17.0 发布,企业级UI设计语言
  • 音乐播放器 Qmmp 1.3.2 发布,修复Wayland会话问题
  • Linux新闻 第970页
  • Oracle 经典面试题分享
  • Oracle 中的SELECT 关键字(查询、检索)
  • Linux Kernel 5.1正式版发布,非长期支持版本
  • 微软在Windows 10中搞了个真正的Linux内核
  • 已是9102年,你熟知的C#还是你刚认识的模样吗?
  • 微软宣布.NET 5计划,支持跨平台、移动开发
  • PingCAP宣布TiDB Binlog组件正式开源
  • 知名Python库Requests作者Kenneth Reitz被指骗捐
  • Google将推出自动删除用户数据的功能
  • 谈判失败:Oracle杀死Java EE
  • 如何在Linux中将命令输出保存到文件
  • Python面向对象之单例模式
  • Ubuntu 18.04 Linux上安装Etherpad,基于Web的实时协作编辑器
  • Python3使用TCP编写一个简易的文件下载器
  • Slimbook - Ubuntu的电池优化工具
  • Python Numpy 数组的基本操作示例
  • 全盛娱乐游戏每天送6元
  • 现金娱乐平台
  • 真钱炸金花
  • 澳门威尼斯人度假村酒店
  • 3d之家