1

我有一个具有以下形式的查询的视图,当我从任何模式在本地服务器上查询它时,它可以完美地工作:

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

Oracle 认为第 2 行有问题。以下是前五行:

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

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

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

4

1 回答 1

1

这里参考

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

有三种解决方法: 1. 使用 " " 语句
禁用查询重写。2.对集合运算符引用的所有语句 使用提示。 3. 对集合运算符中的所有语句使用提示,告诉优化器显式使用物化视图。ALTER {SESSION|SYSTEM} DISABLE QUERY REWRITE
NOREWRITESELECT
REWRITE(mv)SELECT

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

于 2014-03-04T19:51:42.340 回答