ORA-00928 从数据库链接的视图中选择,但在本地工作



我有一个视图,其中包含以下形式的查询,当我从任何架构在本地服务器上查询它时,它都能完美运行:

WITH dates AS (
    SELECT  /*+ materialize */ ...  FROM ( SELECT ... FROM table@link)
    UNION ALL
    SELECT * FROM ( SELECT /*+ materialize */ FROM table@link )
)
SELECT ... FROM (
    SELECT ... FROM (
        SELECT ... FROM (
            SELECT ... FROM (
                SELECT ... FROM 
            )
        ) foo
        LEFT OUTER JOIN (
            SELECT /*+ USE_MERGE(hle dates) */ ... FROM
        )  bar ON conditions
    )
)
UNION  ALL
SELECT ... FROM (
    SELECT ... FROM (
        SELECT ... FROM (
            SELECT ... FROM (
                SELECT ... FROM 
            )
        ) foo
        LEFT OUTER JOIN (
            SELECT /*+ USE_MERGE(hle dates) */ ... FROM
        )  bar ON conditions
    )
)

当我从任何其他服务器上的任何远程数据库链接运行查询时,例如 SELECT * from someschema.my_view@db_link,我得到:

ORA-00928: missing SELECT keyword
ORA-02063: preceding line from PLLDB
00928. 00000 -  "missing SELECT keyword"
*Cause:    
*Action:
Error at Line: 2 Column: 9

甲骨文认为第2行是个问题。以下是前五行实际:

WITH dates AS (
    -- Get days
    SELECT /*+ materialize */
        row_number() OVER (ORDER BY begin_period DESC) rn,
        'D' AS interval_type,

所有其他视图都可以在数据库链接上完美运行(一旦编辑以解决任何相关的 Oracle 错误)。

为什么此视图在本地完美运行,但不可以通过数据库链接工作?

从这里引用

BUG 768478 当 Oracle 基于成本的优化尝试重写包含具有物化视图的集合运算符(例如 UNION、MINUSINTERSECT)的查询时,可能会出现消息"ORA-00928: missing SELECT keyword"。

有三种解决方法:
1. 使用" ALTER {SESSION|SYSTEM} DISABLE QUERY REWRITE"语句禁用查询重写。
2. 对 set 运算符引用的所有SELECT语句使用NOREWRITE提示。
3. 对 set 运算符中的所有SELECT语句使用REWRITE(mv)提示,以告知优化程序显式使用实例化视图。

Scalar expressions引用 SQL 分解元素 ( WITH ... AS ) 在视图的子查询中不完全受支持。在本地访问它工作正常,但每次通过dblinks错误进行远程访问。

最新更新