Oracle在CTE中从另一个视图创建/执行视图时崩溃



我试图在Oracle 19c中创建CTE的视图,但是任何尝试执行SQL或从中创建视图都会导致会话进程崩溃,给我一个"没有更多的数据可以从套接字中读取";在SQL Developer中终止我的会话。

我有一个表,DATA,有几个列,包括PROJECT_ID和DATA_IDENTITY。我可以从这张表中选择。我已经创建了一个递归CTE,它在该表上执行一些工作,从而在执行视图时返回数据的一个子集。然后我将这个CTE保存为一个视图,ELEMENTS_BY_PROJECT_V-我可以从这个视图中进行选择。

现在我正在使用另一个递归CTEHIERARCHY_BY_ELEMENT_V,它使用该视图作为其第一个表。下面是我所描述的两个CTE查询的概要。

CREATE OR REPLACE VIEW ELEMENTS_BY_PROJECT_V AS
WITH 
HISTORY(PROJECT_ID, COMMIT_ID, PREVIOUS_ID, LVL) AS (...),
ELEMENT_DATA(PROJECT_ID, COMMIT_ID, DATA_IDENTITY, E_DATA, LVL) AS (...),
LATEST_VERSIONS(LVL, DATA_IDENTITY_ID) AS (...)
SELECT D.PROJECT_ID, D.COMMIT_ID, D.DATA_IDENTITY, D.E_DATA FROM LATEST_VERSIONS V, ELEMENT_DATA D WHERE V.LVL=D.LVL AND V.DATA_IDENTITY=D.DATA_IDENTITY
CREATE OR REPLACE VIEW HIERARCHY_BY_ELEMENT_V AS
WITH
ROOTS(PROJECT_ID, ELEMENT_ID) AS (
--SELECT PROJECT_ID, DATA_IDENTITY FROM ELEMENTS_BY_PROJECT_V -- Causes crash
--SELECT PROJECT_ID, DATA_IDENTITY FROM DATA                  -- Works fine
),
HIERARCHY(ROOT_PROJECT_ID, ROOT_ID, ELEMENT_ID, LVL) AS (...),
ELEMENT_DATA(ELEMENT_ID, NAME, TYPE) AS (...),
IN_PACKAGES(ROOT_PROJECT_ID, ROOT_ID, PACKAGE_NAMES, PACKAGE_IDS) AS (...)
SELECT * FROM IN_PACKAGES WHERE IN_PACKAGES.PROJECT_ID='123' AND IN_PACKAGES.ROOT_ID='abc'

第二个查询:

  • 如果我使用SELECT PROJECT_ID, DATA_IDENTITY FROM ELEMENTS_BY_PROJECT_V,会话错误如上所述。
  • 如果我直接使用SELECT PROJECT_ID, DATA_IDENTITY FROM DATA从表中选择,CTE执行良好。

这让我认为从另一个CTE内部调用CTE存在问题。我知道你不能明确地这样做,但如果通过一个视图来做,我认为是可以接受的。但是,我也尝试过将这两个查询合并到单个CTE中,但仍然存在会话崩溃问题。

CREATE OR REPLACE VIEW COMBINED_V AS
WITH 
HISTORY(PROJECT_ID, COMMIT_ID, PREVIOUS_ID, LVL) AS (...),
ELEMENT_DATA(PROJECT_ID, COMMIT_ID, DATA_IDENTITY, E_DATA, LVL) AS (...),
LATEST_VERSIONS(LVL, DATA_IDENTITY_ID) AS (...)
ROOTS(PROJECT_ID, ELEMENT_ID) AS (
SELECT D.PROJECT_ID, D.DATA_IDENTITY FROM LATEST_VERSIONS V, ELEMENT_DATA D WHERE V.LVL=D.LVL AND V.DATA_IDENTITY=D.DATA_IDENTITY
),
HIERARCHY(ROOT_PROJECT_ID, ROOT_ID, ELEMENT_ID, LVL) AS (...),
ELEMENT_DATA2(ELEMENT_ID, NAME, TYPE) AS (...),
IN_PACKAGES(ROOT_PROJECT_ID, ROOT_ID, PACKAGE_NAMES, PACKAGE_IDS) AS (...)
SELECT * FROM IN_PACKAGES WHERE IN_PACKAGES.PROJECT_ID='123' AND IN_PACKAGES.ROOT_ID='abc'

知道为什么我不能创建或执行第二个视图吗?

编辑

我在Oracle 21c安装中复制了我的数据,并且在该环境中没有发生问题(可能为什么dbfiddle也没有显示错误)。这似乎是Oracle 19c中的一个问题,不一定是语法问题。

有很多关于这个'崩溃的记录(你给它起了个好名字)像:

  • 网络问题。
  • JDBC驱动程序版本错误关于特殊数据结构的一些问题
  • 数据库错误
    和一些解释,如:
    "此错误表示进程中止,解决此错误的第一步是查看警报日志并查找跟踪文件。"不再有数据可从套接字中读取";不是JDBC或Oracle错误。相反,这是一个通用的通信错误,通常是TNS连接问题的结果

一些人声称他们通过增加initialSize和maxActive连接池的大小来解决这个问题。

我在使用视图时遇到过这种情况-当它在另一边被更改时(或者只是失效-一些奇怪的问题与数字列的空值有关)而不是关于无效的消息得到了这个错误。一直不知道到底发生了什么。在各个方面重新编译使它消失了。
试着检查/更改一些东西:
First检查所涉及的所有对象都是有效的(我不知道,但也许你正在使用一些眨眼或包或其他一些视图或... ...)

Select OWNER, OBJECT_TYPE, OBJECT_NAME
From   dba_objects
Where  STATUS != 'VALID'
Order By OWNER, OBJECT_TYPE;

第二把你的CTE列混叠移到CTE Select子句中,因为有一些问题(有人说是bug)在外部定义别名时,特别是在多次执行并且别名在不同cte中重复的情况下

-- Instead of
WITH some_cte (A_NMBR, A_LTTR) AS (Select 1, 'A' From Dual)
-- Put it this way
WITH some_cte AS (Select 1 "A_NMBR", 'A' "A_LTTR" From Dual)

我真的希望这对你有帮助。

这可能是一个ORACLE错误,没有警告你你的HIERARCHY_BY_ELEMENT_V引用了2个同名的不同CTE: ELEMENT_DATA在HIERARCHY_BY_ELEMENT_V中定义,但也在HIERARCHY_BY_ELEMENT_V使用的ELEMENTS_BY_PROJECT_V中定义。

最新更新